🐊Putout adds support of transformations for @putout/printer.
npm i @putout/plugin-printer -D
- ✅ add-args;
- ✅ add-missing-spaces-to-type-checker;
- ✅ add-missing-colon-to-type-checker;
- ✅ add-missing-tuples-to-type-checker;
- ✅ apply-breakline;
- ✅ apply-computed-print;
- ✅ apply-create-test-url;
- ✅ apply-linebreak;
- ✅ apply-types;
- ✅ check-type-passed-to-type-checker;
- ✅ check-if-success-possible-in-type-checker;
- ✅ merge-tuple-of-type-checker;
- ✅ declare;
- ✅ remove-args;
- ✅ remove-useless-maybe;
- ✅ remove-legacy-test-declaration;
- ✅ remove-trailing-spaces-from-type-checker;
- ✅ remove-useless-spaces-from-type-checker;
- ✅ remove-useless-colon-from-type-checker;
- ✅ remove-useless-tuples-from-type-checker;
- ✅ remove-useless-not-from-type-checker;
- ✅ remove-useless-path-from-type-checker;
- ✅ reverse-comparison-in-type-checker;
{
"rules": {
"printer/add-args": "on",
"printer/add-missing-tuples-to-type-checker": "on",
"printer/add-missing-colon-to-type-checker": "on",
"printer/add-missing-spaces-to-type-checker": "on",
"printer/apply-breakline": "on",
"printer/apply-linebreak": "on",
"printer/apply-computed-print": "on",
"printer/apply-create-test-url": "on",
"printer/apply-types": "on",
"printer/check-type-passed-to-type-checker": "on",
"printer/check-if-success-possible-in-type-checker": "on",
"printer/declare": "on",
"printer/merge-tuple-of-type-checker": "on",
"printer/remove-args": "on",
"printer/remove-useless-maybe": "on",
"printer/remove-trailing-spaces-from-type-checker": "on",
"printer/remove-useless-spaces-from-type-checker": "on",
"printer/remove-useless-colon-from-type-checker": "on",
"printer/remove-useless-not-from-type-checker": "on",
"printer/remove-useless-path-from-type-checker": "on",
"printer/remove-useless-tuples-from-type-checker": "on",
"printer/reverse-comparison-in-type-checker": "on"
}
}-print.newline();
-indent();
print.breakline();-indent();
-print.newline();
print.linebreak();Checkout in 🐊Putout Editor.
-const {isIdentifier} = require('@babel/types');
+const {types} = require('@babel/types');
+const {isIdentifier} = types;module.exports = {
TSPropertySignature(path) {
const {optional} = path.node;
print('__key');
maybe.print(optional, '?');
},
};module.exports = {
TSPropertySignature(path, {print, maybe}) {
const {optional} = path.node;
print('__key');
maybe.print(optional, '?');
},
};Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['-:->!', isInsideArray],
['-:parentPath->', isCoupleLines],
]);export const beforeIf = createTypeChecker([
['-: -> !', isInsideArray],
['-: parentPath ->', isCoupleLines],
]);Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['+ -> !', isInsideArray],
['- parentPath ->', isCoupleLines],
]);export const beforeIf = createTypeChecker([
['+: -> !', isInsideArray],
['-: parentPath ->', isCoupleLines],
]);Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
'- : -> !StringLiteral',
'- : -> BlockStatement',
'- : -> WrongType',
['- : ->', isBlockStatement],
['-', isBlockStatement],
]);export const beforeIf = createTypeChecker([
['- : -> !StringLiteral'],
['- : -> BlockStatement'],
['- : -> WrongType'],
['- : ->', isBlockStatement],
['-', isBlockStatement],
]);print(path.get('block'));print('__block');Checkout in 🐊Putout Editor.
import {createTest} from '#test';
const {test, fixture} = createTest(__dirname);import {createTest} from '#test';
const {test, fixture} = createTest(import.meta.url);print.indent(is);print.indent();Checkout in 🐊Putout Editor.
maybe.print.linebreak(wasNewline);
maybe.print.newline(!wasNewline);maybe.indent(wasNewline);
print.newline();Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['- : -> !', isInsideArray],
]);export const beforeIf = createTypeChecker([
['-: -> !', isInsideArray],
]);Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['+:', isInsideArray],
['-:', isCoupleLines],
]);export const beforeIf = createTypeChecker([
['+', isInsideArray],
['-', isCoupleLines],
]);Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['-: -> !+'],
['+: -> !-'],
]);export const beforeIf = createTypeChecker([
['-: -> -'],
['+: -> +'],
]);Selector always starts from path, so it can be parentPath., or node., but never path., since it is self reference.
Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['-: path.parentPath -> ', isCoupleLines],
]);export const beforeIf = createTypeChecker([
['-: parentPath -> ', isCoupleLines],
]);Checkout in 🐊Putout Editor.
export const allStrings = createTypeChecker([
['- : -> BlockStatement'],
['- : -> WrongType'],
]);export const allStrings = createTypeChecker([
'- : -> BlockStatement',
'- : -> WrongType',
]);Checkout in 🐊Putout Editor.
export const beforeIf = createTypeChecker([
['-: parentPath -> ', isCoupleLines],
]);export const beforeIf = createTypeChecker([
['-: parentPath ->', isCoupleLines],
]);Checkout in 🐊Putout Editor.
When you have only negative branch defined in type checker it never never succeeds (+), and always returns false.
Consider adding success branch, or remove type checker.
☝️ This rule has no autofix, because most likely tests will fail after auto fix, and instead of observing code with a problem, you will first see failed tests, and then after some searches determine that there is a wrong auto fix.
const isSimple = createTypeChecker([
'-: -> SpreadElement',
'-: -> Identifier',
'-: -> !CallExpression',
]);
const isSimpleAfterObject = createTypeChecker([
['-', isSimple],
['-', callWithNext(isObjectExpression)],
['-', callWithPrev(isObjectExpression)],
]);Possible fix:
const isSimple = createTypeChecker([
'-: -> SpreadElement',
'-: -> Identifier',
'+: -> !CallExpression',
]);
const isSimpleAfterObject = createTypeChecker([
['-', isSimple],
['-', callWithNext(isObjectExpression)],
['+', callWithPrev(isObjectExpression)],
]);Checkout in 🐊Putout Editor.
☝️ This rule has no autofix, because most likely tests will fail after auto fix, and instead of observing code with a problem, you will first see failed tests, and then after some searches determine that there is a wrong auto fix.
export const beforeIf = createTypeChecker([
['- : -> WrongType'],
]);Here is possible correct code:
export const beforeIf = createTypeChecker([
['- : -> Identifier'],
]);isIdentifier();
test('', (t) => {
t.print(fixture.returnStatement);
});const {types} = require('@putout/babel');
const {createTest} = require('#test');
const {test, fixture} = createTest(__dirname);
const {isIdentifier} = types;
isIdentifier();
test('', (t) => {
t.print(fixture.returnStatement);
});Checkout in 🐊Putout Editor.
export const isNewlineAfterComma = createTypeChecker([
['+: -> !', isObjectExpression],
['+: ->', isStringLiteral],
['+', isStringLiteral],
]);export const isNewlineAfterComma = createTypeChecker([
['+: -> !ObjectExpression'],
['+: -> StringLiteral'],
['+: StringLiteral'],
]);Checkout in 🐊Putout Editor.
const isMoreThenMaxElementLengthInOneLine = createTypeChecker([
['-: node.elements.length -> !', '<', 2],
['-: node.elements.length -> !', '>', 2],
['-: node.elements.length -> !', '>=', 2],
['-: node.elements.length -> !', '<=', 2],
]);const isMoreThenMaxElementLengthInOneLine = createTypeChecker([
['-: node.elements.length', '>=', 2],
['-: node.elements.length', '<=', 2],
['-: node.elements.length', '<', 2],
['-: node.elements.length', '>', 2],
]);-const {printExtension} = require('../../../test/printer');
-const {readFixtures} = require('../../../test/fixture');
-
-const fixture = readFixtures(__dirname);
-
-const test = extend({
- print: printExtension,
-});MIT