@putout/plugin-putout
v29.35.0
Published
πPutout plugin helps with plugins development
Downloads
55,460
Maintainers
Readme
@putout/plugin-putout 
πPutout plugin helps with plugins development.
Install
npm i @putout/plugin-putout -DRules
- β apply-type-check
- β add-await-to-progress;
- β add-crawl-file;
- β add-path-arg-to-filter;
- β add-path-arg-to-fix;
- β add-path-arg-to-match;
- β add-path-arg-to-visitors;
- β add-places-to-compare-places;
- β add-push-arg;
- β add-test-args;
- β add-track-file;
- β add-traverse-args;
- β apply-async-formatter;
- β apply-create-nested-directory;
- β apply-create-test;
- β apply-declare;
- β apply-destructuring;
- β apply-destructuring-to-options;
- β apply-engine-node-version;
- β apply-exports;
- β apply-exports-to-add-args;
- β apply-exports-to-match-files;
- β apply-exports-to-rename-files;
- β apply-fixture-name-to-message;
- β apply-for-of-to-track-file;
- β apply-get-binding;
- β apply-insert-after;
- β apply-insert-before;
- β apply-lowercase-to-node-builders;
- β apply-name-to-is-identifier;
- β apply-namespace-specifier;
- β apply-parens;
- β apply-processors-destructuring;
- β apply-remove;
- β apply-rename;
- β apply-report;
- β apply-short-processors;
- β apply-string-to-property-key;
- β apply-transform-with-options;
- β apply-traverser-to-ignore;
- β apply-vars;
- β check-declare;
- β check-match;
- β check-replace-code;
- β convert-add-argument-to-add-args;
- β convert-babel-types;
- β convert-destructuring-to-identifier;
- β convert-dirname-to-url;
- β convert-find-to-traverse;
- β convert-get-file-content-to-read-file-content;
- β convert-get-rule-to-require;
- β convert-include-to-traverse;
- β convert-match-to-function;
- β convert-method-to-property;
- β convert-node-to-path-in-get-template-values;
- β convert-number-to-numeric;
- β convert-plugins-element-to-tuple;
- β convert-process-to-find;
- β convert-progress-to-track-file;
- β convert-push-object-to-push-path;
- β convert-putout-test-to-create-test;
- β convert-replace-to-function;
- β convert-replace-to-traverse;
- β convert-replace-with;
- β convert-replace-with-multiple;
- β convert-report-to-function;
- β convert-to-no-transform-code;
- β convert-traverse-to-include;
- β convert-traverse-to-replace;
- β convert-traverse-to-scan;
- β convert-traverse-to-super-traverse;
- β convert-url-to-dirname;
- β create-test;
- β declare;
- β declare-path-variable;
- β declare-template-variables;
- β includer;
- β move-require-on-top-level;
- β remove-empty-array-from-process;
- β remove-empty-object-from-transform;
- β remove-message-from-no-report-after-transform;
- β remove-unused-get-properties-argument;
- β remove-useless-printer-option;
- β remove-useless-source-argument;
- β rename-operate-to-operator;
- β replace-operate-with-operator;
- β replace-test-message;
- β shorten-imports;
- β simplify-replace-template;
- β convert-replacer-to-includer;
- β remove-useless-match;
- β remove-useless-type-check-declaration;
- β shorten-path-get;
File rules
- β sort-readme-file;
Config
{
"rules": {
"putout/add-await-to-progress": "on",
"putout/add-crawl-file": "on",
"putout/add-path-arg-to-filter": "on",
"putout/add-path-arg-to-fix": "on",
"putout/add-path-arg-to-match": "on",
"putout/add-path-arg-to-visitors": "on",
"putout/add-places-to-compare-places": "on",
"putout/add-push-arg": "on",
"putout/add-test-args": "on",
"putout/add-track-file": "on",
"putout/add-traverse-args": "on",
"putout/apply-async-formatter": "on",
"putout/apply-create-nested-directory": "on",
"putout/apply-create-test": "on",
"putout/apply-declare": "on",
"putout/apply-destructuring": "on",
"putout/apply-destructuring-to-options": "on",
"putout/apply-engine-node-version": "off",
"putout/apply-exports": "off",
"putout/apply-exports-to-add-args": "on",
"putout/apply-exports-to-match-files": "on",
"putout/apply-exports-to-rename-files": "on",
"putout/apply-fixture-name-to-message": "on",
"putout/apply-for-of-to-track-file": "on",
"putout/apply-get-binding": "on",
"putout/apply-insert-after": "on",
"putout/apply-insert-before": "on",
"putout/apply-lowercase-to-node-builders": "on",
"putout/apply-name-to-is-identifier": "on",
"putout/apply-namespace-specifier": "on",
"putout/apply-parens": "on",
"putout/apply-processors-destructuring": "on",
"putout/apply-remove": "on",
"putout/apply-rename": "on",
"putout/apply-report": "on",
"putout/apply-short-processors": "on",
"putout/apply-string-to-property-key": "on",
"putout/apply-transform-with-options": "on",
"putout/apply-traverser-to-ignore": "on",
"putout/apply-type-check": "on",
"putout/apply-vars": "on",
"putout/check-declare": "on",
"putout/check-match": "on",
"putout/check-replace-code": ["on", {
"once": true
}],
"putout/convert-add-argument-to-add-args": "on",
"putout/convert-babel-types": "on",
"putout/convert-destructuring-to-identifier": "on",
"putout/convert-dirname-to-url": "on",
"putout/convert-get-file-content-to-read-file-content": "on",
"putout/convert-get-rule-to-require": "on",
"putout/convert-include-to-traverse": "on",
"putout/convert-match-to-function": "on",
"putout/convert-method-to-property": "on",
"putout/convert-node-to-path-in-get-template-values": "on",
"putout/convert-number-to-numeric": "on",
"putout/convert-plugins-element-to-tuple": "on",
"putout/convert-process-to-find": "on",
"putout/convert-progress-to-track-file": "on",
"putout/convert-push-object-to-push-path": "on",
"putout/convert-putout-test-to-create-test": "on",
"putout/convert-replace-to-function": "on",
"putout/convert-replace-to-traverse": "on",
"putout/convert-replace-with": "on",
"putout/convert-replace-with-multiple": "on",
"putout/convert-report-to-function": "on",
"putout/convert-to-no-transform-code": "on",
"putout/convert-traverse-to-include": "on",
"putout/convert-traverse-to-replace": "on",
"putout/convert-traverse-to-scan": "on",
"putout/convert-traverse-to-super-traverse": "on",
"putout/convert-url-to-dirname": "on",
"putout/create-test": "on",
"putout/declare": "on",
"putout/declare-path-variable": "on",
"putout/declare-template-variables": "on",
"putout/includer": "on",
"putout/move-require-on-top-level": "on",
"putout/remove-empty-array-from-process": "on",
"putout/remove-empty-object-from-transform": "on",
"putout/remove-message-from-no-report-after-transform": "on",
"putout/remove-unused-get-properties-argument": "on",
"putout/remove-useless-printer-option": "on",
"putout/remove-useless-source-argument": "on",
"putout/replace-test-message": "on",
"putout/shorten-imports": "on",
"putout/simplify-replace-template": "on",
"putout/sort-readme-file": "on",
"putout/convert-replacer-to-includer": "on",
"putout/remove-useless-match": "on",
"putout/remove-useless-type-check-declaration": "on",
"putout/shorten-path-get": "on"
}
}add-await-to-progress
Checkout in πPutout Editor.
β Example of incorrect code
const {replaceWith} = require('putout').operator;
module.exports.fix = (path) => {
replaceWith(path, identifier('hello'));
};β Example of correct code
module.exports.fix = (path) => {
path.replaceWithMultiple([
identifier('hello'),
]);
};add-crawl-file
Checkout in πPutout Editor.
β Example of incorrect code
const {replaceWithMultiple} = require('putout').operator;
module.exports.fix = (path) => {
replaceWithMultiple(path, [
identifier('hello'),
]);
};β Example of correct code
module.exports.replace = {
'let __a = __b': 'const __b = __a',
};add-path-arg-to-filter
Checkout in πPutout Editor.
β Example of incorrect code
createTest(__dirname, {
printer: 'putout',
plugins: [
['putout/create-test', plugin],
],
});β Example of correct code
const {isNumberLiteral} = types;
isNumberLiteral(node);add-path-arg-to-fix
Checkout in πPutout Editor.
β Example of incorrect code
__putout_processor_json({
rules: {
'putout/create-test': ['on', {
add: [
['printer', 'putout'],
],
}],
},
});β Example of correct code
createTest(__dirname, {
'putout/create-test': plugin,
});add-path-arg-to-match
Checkout in πPutout Editor.
β Example of incorrect code
const {isNumericLiteral} = types;
isNumericLiteral(node);β Example of correct code
import putoutTest from '@putout/test';
const test = putoutTest(__dirname, {
'remove-unused-variables': rmVars,
});add-path-arg-to-visitors
Checkout in πPutout Editor.
β Example of incorrect code
import {createTest} from '@putout/test';
const test = createTest(__dirname, {
'remove-unused-variables': rmVars,
});β Example of correct code
t.transform('nested-not-block', [
['convert-if-to-jmp', convertIfToJmp],
convertDoWhileToJnz,
]);add-push-arg
Checkout in πPutout Editor.
β Example of incorrect code
t.transform('nested-not-block', [
['convert-if-to-jmp', convertIfToJmp],
['convert-do-while-to-jnz', convertDoWhileToJnz],
]);β Example of correct code
export const fix = ({path}) => {
removeClassName(path, SELECTED);
};
push({
path: child,
});add-test-args
β Example of incorrect code
export const fix = (path) => {
removeClassName(path, SELECTED);
};
push(child);β Example of correct code
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
const code = 'const {name} = array[0]';
t.transform(code, '');
t.end();
});add-track-file
Checkout in πPutout Editor.
β Example of incorrect code
module.exports.replace = () => ({
'let __a = __b': 'const __b = __a',
});β Example of correct code
export const fix = () => {};
export const replace = () => ({
[__json]: (path) => {
const __aPath = path.get('arguments.0');
const {importsPath} = getProperties(__aPath, ['imports']);
},
});add-traverse-args
Checkout in πPutout Editor. Supported args:
push:
β Example of incorrect code
test('plugin-apply-destructuring: transform: array: destructuring', (t) => {
const code = 'const {name} = array[0]';
t.noTransformCode(code);
t.end();
});β Example of correct code
module.exports.fix = (path) => {
path.replaceWith(identifier('hello'));
};apply-async-formatter
β Example of incorrect code
test('formatter: codeframea', (t) => {
t.format(codeframe, 1);
t.end();
});β Example of correct code
test('formatter: codeframea', async ({format}) => {
await format(codeframe, 1);
});apply-create-nested-directory
Checkout in Putout Editor.
β Example of incorrect code
const dirPath = createDirectory(path, '/hello/world');
const dirPath2 = createNestedDirectory(path, 'world');β Example of correct code
const dirPath = createNestedDirectory(path, '/hello/world');
const dirPath2 = createDirectory(path, 'world');apply-create-test
β Example of incorrect code
const test = require('@putout/test')({
'remove-debugger': plugin,
});β Example of correct code
const {createTest} = require('@putout/test');
const test = createTest({
'remove-debugger': plugin,
});apply-declare
Better to use Declareator instead of operator.declare().
Check out in πPutout Editor.
β Example of incorrect code
const {operator} = require('putout');
const {declare} = operator;
module.exports = declare({
tryCatch: `import tryCatch from 'try-catch'`,
tryToCatch: `import tryToCatch from 'try-to-catch'`,
});β Example of correct code
module.exports.declare = () => ({
tryCatch: `import tryCatch from 'try-catch'`,
tryToCatch: `import tryToCatch from 'try-to-catch'`,
});apply-destructuring
Check out in πPutout Editor.
β Example of incorrect code
const putout = require('putout');β Example of correct code
const {putout} = require('putout');apply-destructuring-to-options
Check out in πPutout Editor.
β Example of incorrect code
export const filter = (path, options) => {};β Example of correct code
export const filter = (path, {options}) => {};apply-engine-node-version
Check out in πPutout Editor.
{
"name": "@putout/plugin-variables",
"peerDependencies": {
"putout": ">=41"
},
"license": "MIT",
"engines": {
- "node": ">=20"
+ "node": ">=22"
}
}apply-exports
Check out in πPutout Editor. Possible configuration:
{
"rules": {
"putout/apply-exports": ["on", {
"addArgs": [
"report",
"fix",
"scan"
]
}]
}
}β Example of incorrect code
export default createRenameProperty([
...v32,
...v29,
]);β Example of correct code
export const {
report,
fix,
scan,
} = createRenameProperty([
...v32,
...v29,
]);apply-exports-to-add-args
Check out in πPutout Editor.
β Example of incorrect code
export default addArgs(__args);β Example of correct code
export const {
report,
fix,
traverse,
} = addArgs(__args);apply-exports-to-match-files
Check out in πPutout Editor.
β Example of incorrect code
export default matchFiles({
'*.cjs': plugin,
});β Example of correct code
export const {
report,
fix,
scan,
} = matchFiles({
'*.cjs': plugin,
});apply-exports-to-rename-files
Check out in πPutout Editor.
β Example of incorrect code
export default renameFiles({
type: 'module',
mask: '*.mjs',
rename(name) {
return name.replace(/mjs$/, 'js');
},
});β Example of correct code
export const {
report,
fix,
scan,
} = renameFiles({
type: 'module',
mask: '*.mjs',
rename(name) {
return name.replace(/mjs$/, 'js');
},
});apply-for-of-to-track-file
The Generator object is returned by a
generator functionand it conforms to both the iterable protocol and theiteratorprotocol.(c) MDN
trackFile is generator function used to count progress that can be used in Scanner.
Checkout in πPutout Editor
β Example of incorrect code
module.exports.scan = (path, {push, trackFile}) => {
trackFile(path, '*.swp').map(push);
};β Example of correct code
module.exports.scan = (path, {push, trackFile}) => {
for (const file of trackFile(path, '*.swp')) {
push(file);
}
};apply-get-binding
Checkout in πPutout Editor.
β Example of incorrect code
path.scope.getBinding('require');β Example of correct code
getBinding(path, 'require');apply-insert-after
Better to use insertAfter(a, b) method of operator.
It helps to avoid duplication of comments.
β Example of incorrect code
export const fix = (path) => {
path.insertAfter(path.get('init'));
};β Example of correct code
import {operator} from 'putout';
const {insertAfter} = operator;
export const fix = (path) => {
insertAfter(path, path.get('init'));
};apply-insert-before
Better to use insertBefore(a, b) method of operator.
β Example of incorrect code
export const fix = (path) => {
path.insertBefore(path.get('init'));
};β Example of correct code
import {operator} from 'putout';
const {insertBefore} = operator;
export const fix = (path) => {
insertBefore(path, path.get('init'));
};apply-lowercase-to-node-builders
Checkout in πPutout Editor.
β Example of incorrect code
path.node = Identifier('x');β Example of correct code
path.node = identifier('x');apply-name-to-is-identifier
Checkout in πPutout Editor.
β Example of incorrect code
isIdentifier(path, 'hello');β Example of correct code
isIdentifier(path, {
name: 'hello',
});apply-namespace-specifier
Most likely what you need is esm/resolve-imported-file.
β Example of incorrect code
import rmUnused from '@putout/plugin-remove-unused-variables';β Example of correct code
import * as rmUnused from '@putout/plugin-remove-unused-variables';apply-parens
Better use addParens(path) method of operator instead of using path.node.extra to have support of both printers:
- β
@putout/printer; - β
babel;
Check out in πPutout Editor.
β Example of incorrect code
path.node.extra.parenthesized = false;
path.node.extra.parenthesized = true;
if (!path.node.extra?.parenthesized)
return;β Example of correct code
removeParens(path);
addParens(path);
if (!hasParens(path))
return;apply-processors-destructuring
β Example of incorrect code
test('', async (t) => {
await t.process({});
});β Example of correct code
test('', async ({process}) => {
await process({});
});apply-processors-destructuring
β Example of incorrect code
test('', async (t) => {
await t.process({});
});β Example of correct code
test('', async ({process}) => {
await process({});
});apply-remove
Better to use remove(path) method of operator.
It helps to preserve comments.
β Example of incorrect code
export const fix = (path) => {
path.remove();
};β Example of correct code
import {operator} from 'putout';
const {remove} = operator;
export const fix = (path) => {
remove(path);
};apply-rename
Better use rename(path, from, to) method of operator.
Check out in πPutout Editor.
β Example of incorrect code
export const fix = ({path, from, to}) => {
path.scope.rename(from, to);
};β Example of correct code
import {operator} from 'putout';
const {rename} = operator;
export const fix = ({path, from, to}) => {
rename(path, from, to);
};apply-report
Checkout in πPutout Editor.
β Example of incorrect code
t.noReport('rename-files-full', {
from: ['/'],
to: [],
});
t.noReportWithOptions('rename-files-full');
t.noReport('a', 'Use b');
t.report('a');β Example of correct code
t.noReportWithOptions('rename-files-full', {
from: ['/'],
to: [],
});
t.noReport('rename-files-full');
t.report('a', 'Use b');
t.noReport('a');apply-short-processors
Apply short names of processors, for example __json instead of __putout_processor_json . Checkout out in πPutout Editor.
β Example of incorrect code
export const match = () => ({
'__putout_processor_ignore(__a)': ({__a}) => {
const list = __a.elements.map(getValue);
},
'__putout_processor_filesystem(__a)': ({__a}) => {
const list = __a.elements.map(getValue);
},
});β Example of correct code
export const match = () => ({
[__ignore]: ({__array}) => {
const list = __array.elements.map(getValue);
},
[__filesystem]: ({__object}) => {
const list = __object.elements.map(getValue);
},
});apply-string-to-property-key
Checkout in πPutout Editor.
β Example of incorrect code
export const replace = {
[`section('@select', select(__args))`]: ({__args}, path) => {
__args.unshift(identifier('id'));
return path;
},
};β Example of correct code
export const replace = {
'section("@select", select(__args))"': ({__args}, path) => {
__args.unshift(identifier('id'));
return path;
},
};apply-transform-with-options
Checkout in πPutout Editor.
β Example of incorrect code
t.transform('submenu', {
submenuIndex: 1,
insideSubmenu: true,
});β Example of correct code
t.transformWithOptions('submenu', {
submenuIndex: 1,
insideSubmenu: true,
});apply-traverser-to-ignore
Checkout in πPutout Editor.
β Example of incorrect code
export const {
report,
match,
replace,
} = ignore({
type: __json,
name: '.nycrc.json',
field: 'exclude',
list: ['*.config.*'],
});β Example of correct code
export const {
report,
fix,
traverse,
} = ignore({
type: __json,
name: '.nycrc.json',
field: 'exclude',
list: ['*.config.*'],
});apply-vars
Checkout in πPutout Editor.
β Example of incorrect code
export const replace = () => ({
'__a(__args': ({}, path) => {
return true;
},
});
export const match = () => ({
'__a(__args': ({}, path) => {
return '';
},
});β Example of correct code
export const replace = () => ({
'__a(__args': (vars, path) => {
return true;
},
});
export const match = () => ({
'__a(__args': (vars, path) => {
return '';
},
});check-declare
Checks that Declarator transform is possible. Checkout in πPutout Editor:
β Example of incorrect code
export const match = () => ({
'nemesis.getChar()': () => {
return path.parentPath.isExpressionStatement();
},
'getChar()': ({__a}) => {
return path.parentPath.isExpressionStatement();
},
});β Example of correct code
export const match = () => ({
'nemesis.getChar()': (vars, path) => {
return path.parentPath.isExpressionStatement();
},
'getChar()': ({__a}, path) => {
return path.parentPath.isExpressionStatement();
},
});check-match
Checks that Replacer match() keys exists in replace.
Checkout in πPutout Editor.
β Example of incorrect code
export const scan = (root, {trackFile}) => {
for (const file of trackFile(root, names)) {
push(file);
}
};β Example of correct code
export const scan = (root, {trackFile, push}) => {
for (const file of trackFile(root, names)) {
push(file);
}
};check-replace-code
Checks that Replacer transform is possible.
Pass once=false to always fail no matter how many fixCounts passed.
β Example of incorrect code
export const traverse = () => ({
TSUnionType() {
console.log(path);
},
});β Example of correct code
export const traverse = () => ({
TSUnionType(path) {
console.log(path);
},
});convert-add-argument-to-add-args
β Example of incorrect code
test('', () => {
comparePlaces();
});β Example of correct code
test('', ({comparePlaces}) => {
comparePlaces();
});convert-babel-types
β Example of incorrect code
module.exports.preProcess = () => {};
module.exports.postProcess = () => {};β Example of correct code
module.exports.branch = (rawSource) => [];
module.exports.merge = (processedSource, list) => '';convert-destructuring-to-identifier
β Example of incorrect code
module.exports.match = () => ({
'module.exports.traverse = __a'({}, path) {},
});β Example of correct code
module.exports.match = () => ({
'module.exports.traverse = __a': ({}, path) => {},
});convert-dirname-to-url
β Example of incorrect code
module.exports.traverse = () => ({
'__a.replace(/__b/g, __c)': (path) => {
push(path);
},
});β Example of correct code
module.exports.traverse = ({push}) => ({
'__a.replace(/__b/g, __c)': (path) => {
push(path);
},
});β Example of incorrect code
module.exports.traverse = () => ({
ImportDeclaration(path) {
const {node} = path;
const {name} = node.specifiers[0].local;
store('name', name);
},
});β Example of correct code
module.exports.traverse = ({store}) => ({
ImportDeclaration(path) {
const {node} = path;
const {name} = node.specifiers[0].local;
store('name', name);
},
});β Example of incorrect code
export const traverse = () => ({
ImportDeclaration(path) {
listStore(path);
},
});β Example of correct code
module.exports.traverse = ({listStore}) => ({
ImportDeclaration(path) {
listStore(path);
},
});β Example of incorrect code
export const traverse = () => ({
'module.exports.match = __object': pathStore,
});β Example of correct code
export const traverse = ({pathStore}) => ({
'module.exports.match = __object': pathStore,
});convert-get-file-content-to-read-file-content
To read file content use readFileContent and never confuse.
Checkout in πPutout Editor.
β Example of incorrect code
const {operator} = require('putout');
const {addArgument} = operator;
module.exports = addArgument({
t: ['t', 'test("__a", (__args) => __body)'],
});β Example of correct code
const {operator} = require('putout');
const {addArgs} = operator;
module.exports = addArgs({
t: ['t', 'test("__a", (__args) => __body)'],
});convert-get-rule-to-require
- β import Nested plugins in Deno and Browser;
- β
easier bundle with rollup without
dynamicRequireTargets; - β easier to migrate to ESM;
Checkout in πPutout Editor.
β Example of incorrect code
export const scan = (root, {push, progress}) => {
trackFile();
};β Example of correct code
export const scan = (root, {push, progress, trackFile}) => {
trackFile();
};convert-include-to-traverse
Checkout in π*Putout Editor.
β Example of incorrect code
module.exports.replace = () => ({
'if (__a = __b) __body': 'if (__a === "__b") __body',
});βοΈ There is no fix for this rule, it used internally to be more confident about test coverage, because of declaration form, transforms cannon be checked by nyc and c8, and uncovered lines can find unfixable false positives when running on code.
This is additional tests, if you forget to test some case (from a big list of rules that is supported) it will be checked with this rule and make transforms more stable.
convert-match-to-function
β Example of incorrect code
module.exports.traverse = ({push, options}) => ({
[__filesystem](path) {
const {names} = options;
for (const name of names) {
const files = findFile(path, name);
for (const file of files) {
push({
name,
path: file,
});
}
}
},
});β Example of correct code
module.exports.scan = (path, {push, options}) => {
const {names} = options;
for (const name of names) {
const files = findFile(path, name);
for (const file of files) {
push(file, {
name,
});
}
}
};convert-method-to-property
- property simpler to work with;
- support of
convert-destructuring-to-identifierwhich isReplacer, whileconvert-method-to-propertyisIncluder(searches forObjectMethodnode);
β Example of incorrect code
export const filter = () => {
return path.isStringLiteral();
};β Example of correct code
export const filter = (path) => {
return path.isStringLiteral();
};convert-node-to-path-in-get-template-values
β Example of incorrect code
module.exports.declare = () => ({
isNumber: 'const isNumber = () => {}',
isString: 'const isNumber = () => {}',
});βοΈ There is no fix for this rule, it used internally to be more confident about test coverage, because of declaration form, transforms cannon be checked by nyc and c8, and uncovered lines can find unfixable false positives when running on code.
This is additional tests, if you forget to test some case (from a big list of rules that is supported) it will be checked with this rule and make transforms more stable.
convert-number-to-numeric
Prevent Babel warning: The node type NumberLiteral has been renamed to NumericLiteral.
β Example of incorrect code
const {
ObjectExpression,
SpreadElement,
isObjectExpression,
isIdentifier,
} = require('@babel/types');β Example of correct code
const {
ObjectExpression,
SpreadElement,
isObjectExpression,
isIdentifier,
} = require('putout').types;convert-plugins-element-to-tuple
Checkout in πPutout Editor.
β Example of incorrect code
const {__a, __b} = getTemplateValues(path.node, 'const __a = __b');β Example of correct code
const {__a, __b} = getTemplateValues(path, 'const __a = __b');convert-process-to-find
β Example of incorrect code
export const fix = () => {
path.remove();
};β Example of correct code
export const fix = (path) => {
path.remove();
};convert-push-object-to-push-path
Checkout in πPutout Editor.
β Example of incorrect code
const parseOptions = require('putout/lib/parse-options');β Example of correct code
const parseOptions = require('putout/parse-options');convert-putout-test-to-create-test
Fixes results of @putout/convert-commonjs-to-esm work.
β Example of incorrect code
module.exports.replace = () => ({
'const __a = __b': ({}) => {},
'const __c = __d': ({}, path) => {},
});β Example of correct code
module.exports.replace = () => ({
'const __a = __b': (vars) => {},
'const __c = __d': (vars, path) => {},
});convert-replace-to-function
β Example of incorrect code
export const traverse = () => ({
[__markdown]: (path) => {
traverse();
},
});β Example of correct code
export const traverse = () => ({
[__markdown]: (path) => {
superTraverse(path, {
'__a(__b, __c)': (path) => {},
});
},
});add-places-to-compare-places"
β Example of incorrect code
comparePlaces takes two or more arguments.
Checkout in πPutout Editor.
comparePlaces('hello');β Example of correct code
comparePlaces('hello', []);convert-replace-to-traverse
Checkout in πPutout Editor.
β Example of incorrect code
module.exports.traverse = () => ({
'async (__a) => __b': 'async ({process}) => __b',
});β Example of correct code
module.exports.replace = () => ({
'async (__a) => __b': 'async ({process}) => __b',
});convert-replace-with
β Example of incorrect code
export const include = () => ({
ClassDeclaration(path) {},
});β Example of correct code
export const traverse = () => ({
ClassDeclaration(path) {},
});convert-replace-with-multiple
β Example of incorrect code
module.exports.traverse = ({push}) => ({
TSTypeAssertion(path) {
push(path);
},
});β Example of correct code
module.exports.include = () => [
'TSTypeAssertion',
];convert-report-to-function
β Example of incorrect code
export const scan = (root, {push, progress}) => {
crawlFile();
};β Example of correct code
export const scan = (root, {push, progress, crawlFile}) => {
crawlFile();
};convert-to-no-transform-code
β Example of incorrect code
## Rules
-- β
[remove-illegal-strict-mode](#remove-useless-strict-mode);
-- β
[add-node-prefix](#add-node-prefix);
+- β
[add-node-prefix](#add-node-prefix);
+- β
[remove-illegal-strict-mode](#remove-useless-strict-mode);convert-traverse-to-include
β Example of incorrect code
module.exports.match = () => ({
'__a = __b': (vars, path) => {},
});
module.exports.replace = () => ({
'__a = __': '__a',
});βοΈ There is no fix for this rule, it used internally to be more confident about test coverage, because of declaration form, transforms cannon be checked by nyc and c8, and uncovered lines can find unfixable false positives when running on code.
This is additional tests, if you forget to test some case (from a big list of rules that is supported) it will be checked with this rule and make transforms more stable.
convert-traverse-to-replace
β Example of incorrect code
export const match = () => ({
'__a(__args': (vars, path) => {
fn(x);
return __args[__a];
},
});β Example of correct code
export const match = () => ({
'__a(__args': ({__args, __a}, path) => {
fn(x);
return __args[__a];
},
});convert-traverse-to-scan
Checkout in πPutout Editor:
β Example of incorrect code
export const match = () => ({
'__x __a __expr': ({__x}) => {
if (path.isNextPunctuator(assign))
return false;
return isOneOfKeywords(__x, ['const', 'let', 'var']);
},
});β Example of correct code
export const match = () => ({
'__x __a __expr': ({__x}) => {
if (path.isNextPunctuator(assign))
return false;
return isOneOfKeywords(__x, ['const', 'let', 'var']);
},
});convert-traverse-to-super-traverse
Checkout in πPutout Editor.
β Example of incorrect code
compare(a, 'const __a = __b');
isIdentifier(a);β Example of correct code
import {operator, types} from 'putout';
const {compare} = operator;
const {isIdentifier} = types;
compare(a, 'const __a = __b');
isIdentifier(a);convert-url-to-dirname
β Example of incorrect code
test('', ({progress}) => {
progress();
});β Example of correct code
test('', async ({progress}) => {
await progress();
});create-test
Add properties to createTest options, here is example of .putout.json:
Check it out in πPutout Editor.
β Example of incorrect code
module.exports.match = {
'let __a = __b': () => false,
};β Example of correct code
module.exports.match = () => ({
'let __a = __b': () => false,
});declare
β Example of incorrect code
import {createTest} from '@putout/test';
import plugin from '@putout/plugin-debugger';
import {createSimport} from 'simport';
const {__dirname} = createSimport(import.meta.url);
const test = createTest(__dirname, {
'remove-debugger': plugin,
});β Example of correct code
import {createTest} from '@putout/test';
import plugin from '@putout/plugin-debugger';
const test = createTest(import.meta.url, {
'remove-debugger': plugin,
});declare-path-variable
Checkout in πPutout Editor.
β Example of incorrect code
module.exports.report = `'report' should be a 'function'`;β Example of correct code
module.exports.report = () => `'report' should be a 'function'`;declare-template-variables
Checkout in πPutout Editor.
β Example of incorrect code
const {createTest} = require('@putout/test');
const plugin = require('@putout/plugin-debugger');
const test = createTest(__dirname, {
'remove-debugger': plugin,
});β Example of correct code
const {createTest} = require('@putout/test');
const plugin = require('@putout/plugin-debugger');
const test = createTest(import.meta.url, {
'remove-debugger': plugin,
});convert-progress-to-track
Checkout in πPutout Editor.
β Example of incorrect code
module.exports.scan = (root, {push, progress}) => {
const files = findFile(root, ['*']);
const n = files.length;
for (const [i, file] of files.entries()) {
push(file);
progress({
i,
n,
});
}
};β Example of correct code
module.exports.scan = (root, {push, trackFile}) => {
for (const file of trackFile(root, ['*'])) {
push(file);
}
};includer
β Example of incorrect code
module.exports.rules = getRule('remove-unused-variables');β Example of correct code
const removeUnusedVariables = require('./remove-unused-variables');
module.exports.rules = {
'remove-unused-variables': removeUnusedVariables,
};move-require-on-top-level
β Example of incorrect code
const content = getFileContent(file);β Example of correct code
const content = readFileContent(file);remove-empty-array-from-process
Check it out in πPutout Editor.
β Example of incorrect code
module.exports.include = () => 'cons __a = __b';
module.exports.exclude = () => 'var __a = __b';
module.exports.include = 'cons __a = __b';
module.exports.exclude = 'var __a = __b';
module.exports.include = [
'cons __a = __b',
];
module.exports.exclude = [
'var __a = __b',
];
export const include = [
'cons __a = __b',
];
export const exclude = [
'var __a = __b',
];β Example of correct code
module.exports.include = () => [
'const __a = __b',
];
module.exports.exclude = () => [
'var __a = __b',
];
export const include = () => [
'cons __a = __b',
];
export const exclude = () => [
'var __a = __b',
];remove-empty-object-from-transform
Check it out in πPutout Editor.
β Example of incorrect code
test('plugin-putout: rename-operate-to-operator: transform: operator exist', (t) => {
t.noTransform('operator');
t.end();
});
test('plugin-putout: rename-operate-to-operator: report: operator exist', (t) => {
t.noReport('operator');
t.end();
});β Example of correct code
test('plugin-putout: rename-operate-to-operator: no transform: operator exist', (t) => {
t.noTransform('operator');
t.end();
});
test('plugin-putout: rename-operate-to-operator: no report: operator exist', (t) => {
t.noReport('operator');
t.end();
});remove-message-from-no-report-after-transform
Check it out in πPutout Editor.
β Example of incorrect code
test('hello', (t) => {
t.transform('nested-labels', {});
});β Example of correct code
test('hello', (t) => {
t.transform('nested-labels');
});remove-unused-get-properties-argument
Check it out in πPutout Editor.
β Example of incorrect code
await process('input', []);β Example of correct code
await process('input');remove-useless-printer-option
Check it out in πPutout Editor.
putout printer used by default, so there is no need to pass it.
β Example of incorrect code
const {
overridesPath,
parserPath,
rulesPath,
} = getProperties(__jsonPath, [
'parser',
'rules',
'overrides',
'extends',
]);β Example of correct code
const {
overridesPath,
parserPath,
rulesPath,
} = getProperties(__jsonPath, ['parser', 'rules', 'extends']);remove-useless-source-argument
Check it out in πPutout Editor.
β Example of incorrect code
test('github: set-message-of-commit-fixes: no report after transform', (t) => {
t.noReportAfterTransform('set-message-of-commit-fixes', `Set 'message' of 'Commit fixes'`);
t.end();
});β Example of correct code
test('github: set-message-of-commit-fixes: no report after transform', (t) => {
t.noReportAfterTransform('set-message-of-commit-fixes');
t.end();
});replace-test-message
Checks that test message and used operator are synchronized.
Check it out in πPutout Editor.
β Example of incorrect code
const test = require('@putout/test')(__dirname, {
'remove-debugger': require('..'),
});
test('remove debugger: report', (t) => {
t.transform('debugger', {
'remove-debugger': require('..'),
});
t.end();
});β Example of correct code
const removeDebugger = require('..');
const test = require('@putout/test')(__dirname, {
'remove-debugger': removeDebugger,
});
test('remove debugger: report', (t) => {
t.transform('debugger', {
'remove-debugger': removeDebugger,
});
t.end();
});shorten-imports
β Example of incorrect code
const test = createTest(__dirname, {
printer: 'putout',
plugins: [
['remove-unchanged-zero-declarations', plugin],
],
});β Example of correct code
const test = createTest(__dirname, {
plugins: [
['remove-unchanged-zero-declarations', plugin],
],
});simplify-replace-template
Checkout in πPutout Editor.
β Example of incorrect code
module.exports.replace = () => ({
'if (__a) {__b} else {__c}': () => 'if (__a) __b; else __c',
});β Example of correct code
module.exports.replace = () => ({
'if (__a) {__b} else {__c}': 'if (__a) __b; else __c',
});sort-readme-file
Checkout in πPutout Editor:
- β
sort-contents; - β
sort-headings; - β
sort-config; - β
sort-readme-file;
apply-fixture-name-to-message"
Checkout in πPutout Editor.
test('flatlint: convert-comma-to-semicolon: no report: xxx', (t) => {
t.noReport('array');
t.end();
});β Example of correct code
test('flatlint: convert-comma-to-semicolon: no report: array', (t) => {
t.noReport('array');
t.end();
});apply-type-check
Checkout in πPutout Editor.
β Example of incorrect code
if (a.type === 'CallExpression') {}β Example of correct code
if (isCallExpression(a)) {}convert-replacer-to-includer
Checkout in πPutout Editor.
β Example of incorrect code
export const replace = () => ({
'const [__a, {__b}] = __c(__d, __e)': 'const [__a, {__b}] = __c(__d, __e)',
'const [__a, {__b = {}} = {}] = __c(__d, __e)': 'const [__a, {__b = {}} = {}] = __c(__d, __e)',
});β Example of correct code
export const fix = () => {};
export const include = () => [
'const [__a, {__b}] = __c(__d, __e)',
'const [__a, {__b = {}} = {}] = __c(__d, __e)',
];remove-useless-match
Checkout in πPutout Editor.
β Example of incorrect code
export const match = () => ({
'const [__a, {__b}] = __c(__d, __e)': () => true,
'const [__a, {__b = {}} = {}] = __c(__d, __e)': () => true,
});β Example of correct code
remove-useless-type-check-declaration
Checkout in πPutout Editor.
β Example of incorrect code
const isStringLiteral = (arg) => arg.type === 'StringLiteral';β Example of correct code
shorten-path-get
Checkout in πPutout Editor.
β Example of incorrect code
const elements = path.get('arguments')[0].get('elements');β Example of correct code
const elements = path.get('arguments.0.elements');License
MIT
