рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдЯрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдПрд╕рдЯреА рдЯреНрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

рдкрд░рд┐рдЪрдп


рд╣рд░ рджрд┐рди рдЬрдм рдХреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрдкрдпреЛрдЧреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ (рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп, рдпрд╛ рдмрд╕ рд╡рд╛рдВрдЫрдиреАрдп) рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдЬреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реБрдП рд░реАрдлреИрдХреНрдЯрд┐рдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдпрдорд┐рдд рд╣реИрдВред рдЙрдирдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдПрдХ рддрд░рдл, рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрд░, рдЕрджреНрдпрддрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдХреЛ рдЬрд▓рд╛рдК рд▓рдХрдбрд╝реА рдХреЛ рддреЛрдбрд╝рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЦреБрдж рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХреЗрдВ, рдФрд░ рд╡реНрдпрдХреНрддрд┐, рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЖрдЬ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред


рдПрдПрд╕рдЯреА


рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕реЗ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдПрд╕рдЯреА рдХреЛ рдЖрдк рдЬреИрд╕реЗ рдЪрд╛рд╣реЗрдВ рд╡реИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдЗрдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдкрд╛рд░реНрд╕рд░ рд╕реЗред


рдкрд╛рд░реНрд╕рд░


рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ:


a + b 

рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  • рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдХреЛрдб рдХреЛ рдЯреЛрдХрди рдореЗрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдмрддрд╛рддрд╛ рд╣реИ:


 [{ "type": "Identifier", "value": "a" }, { "type": "Punctuator", "value": "+", }, { "type": "Identifier", "value": "b" }] 

  • рдкрд╛рд░реНрд╕ред

рдЯреЛрдХрди рд╕реЗ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдмрдирд╛рддрд╛ рд╣реИ:


 { "type": "BinaryExpression", "left": { "type": "Identifier", "name": "a" }, "operator": "+", "right": { "type": "Identifier", "name": "b" } } 

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ JavaScript рдкрд╛рд░реНрд╕рд░реНрд╕ рд╣реИрдВ, рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:


  • babel-parser - рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЬреЛ babel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ;
  • рдПрд╕реНрдкреНрд░реА - рдП рдкрд╛рд░реНрд╕рд▓ рдЬреЛ eslint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ;
  • acorn - рдкрд┐рдЫрд▓реЗ рджреЛ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ рдЬреЛ рдкрд╛рд░реНрд╕рд░;
  • рдПрд╕реНрдкреНрд░рд┐рдорд╛ - рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд╛рд░реНрд╕рд░ рдЬреЛ рдПрдХреНрдорд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ 2017 рддрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ;
  • cherow рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдирдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ;

рдПрдХ рдорд╛рдирдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд░реНрд╕рд░ рд╣реИ, рдЗрд╕реЗ рдИрд╕реНрддреНрд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рдиреЛрдбреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╛рд░реНрд╕рд░ (рд╕рд╛рде рд╣реА рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдФрд░ рдЬрдирд░реЗрдЯрд░) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реБрдкрд░-рдЫреЛрдЯреЗ-рд╕рдВрдХрд▓рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░


рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @ рдмреИрдмрд▓ / рдЯреНрд░реИрд╡рд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб code рдЪрд░ рд╕реЗ рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред


 import * as parser from "@babel/parser"; import traverse from "@babel/traverse"; const code = `function square(n) { return n * n; }`; const ast = parser.parse(code); traverse(ast, { Identifier(path) { console.log(path.node.name); } }); 

рдЬрдирдХ


рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @ babel / рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ:


 import {parse} from '@babel/parser'; import generate from '@babel/generator'; const code = 'class Example {}'; const ast = parse(code); const output = generate(ast, code); 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкрд╛рдардХ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╛ рдПрдХ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред


рдпрд╣ рдПрдХ рдСрдирд▓рд╛рдЗрди рдЯреВрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрд╕реНрдЯреЗрдХреНрд╕рдкреНрд▓реЗрдпрд░ , рдпрд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рд░реНрд╕рд░, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред


Putout


рдкреБрдЯрдЖрдЙрдЯ рдПрдХ рдкреНрд▓рдЧрдЗрди-рд╕рдХреНрд╖рдо рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЛрдиреЛрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдлрд╛рдпрджреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдПрд╕реНрд▓реЗрдВрдЯ рдФрд░ рдмреИрдмреЗрд▓ рдХреЗ рдмреАрдЪ рдПрдХ рдХреНрд░реЙрд╕ рд╣реИред


eslint рдХреЛрдб рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди eslint рд╡рд┐рдкрд░реАрдд рдХреЛрдб рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЙрди рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


babel putout рддрд░рд╣ putout рдХреЛрдб рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред


рдкреНрд░реЗрдЯрд┐рдпрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░реВрдкрдг рдЙрдкрдХрд░рдг рд╣реИ, рдФрд░ рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реИред


Jscodeshift рдкреБрдЯрдЖрдЙрдЯ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ @ babel / рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрд╕реНрдЯреНрд░реЛ-рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рд░реВрдк рдХреА рдХрд╣рд╛рдиреА


рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, eslint рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдореИрдВ рдЙрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреАрдмрдЧрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЛ рдареАрдХ рдХрд░реЗрдВред рдХреЗрд╡рд▓ , рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВред рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдиреЗ putout рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рдпрд╛, рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдХрдИ рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, putout рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд▓рдЧрдЗрди рд╕рд┐рд╕реНрдЯрдо рддрдХ рдмрдврд╝ рдЧрдпрд╛ред рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЕрдм рд╕рдмрд╕реЗ рдХрдард┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдХрдИ рдЕрдиреНрдп рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред


рдкреБрдЯрдЖрдЙрдЯ рдХреИрд╕реЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


putout рдХрд╛рд░реНрдп рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЗрдВрдЬрди рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ред рдпрд╣ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдкрдХреЛ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд▓рдЧрдЗрдиреНрд╕


putout рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдПрдХ рдирд┐рдпрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЦреЛрдЬреЗрдВ рдФрд░ рд╣рдЯрд╛рдПрдВ:


    • рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░
    • debugger
    • call test.only
    • call test.skip
    • рдХреЙрд▓ console.log
    • рдХреЙрд▓ process.exit
    • рдЦрд╛рд▓реА рдмреНрд▓реЙрдХ
    • рдЦрд╛рд▓реА рдкреИрдЯрд░реНрди

  • рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛ рдЦреЛрдЬреЗрдВ рдФрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:


     //  var one, two; //  var one; var two; 

  • commonjs рдХреЛ commonjs рдмрджрд▓реЗрдВ:



  //  import one from 'one'; //  const one = require('one'); 

  • рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

 //  const name = user.name; //  const {name} = user; 

  1. рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЧреБрдгреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ:

 //  const {name} = user; const {password} = user; //  const { name, password } = user; 

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдпреВрдирд┐рдХреНрд╕ рджрд░реНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд╛рд░, рдлрд┐рд▓реНрдЯрд░ рдореЗрдВ рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрдирд╛:


 const name = user.name; const password = user.password; 

рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЕрдкреНрд▓рд╛рдп -рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 const {name} = user; const {password} = user; 

рдлрд┐рд░, рдорд░реНрдЬ-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА-рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдЗрд╕реЗ рдирд┐рдореНрди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 const { name, password } = user; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЕрд▓рдЧ рдФрд░ рдПрдХ рд╕рд╛рде рджреЛрдиреЛрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдирд╛ рдкреНрд▓рдЧ-рдЗрди рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд▓рдЧ-рдЗрди рдмрд╛рдХреА рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред


рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо putout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ example.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:


 const x = 1, y = 2; const name = user.name; const password = user.password; console.log(name, password); 

рдЕрдм рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ example.js рдкрд╛рд╕ рдХрд░рдХреЗ putout рдЪрд▓рд╛рдПрдВ:


 coderaiser@cloudcmd:~/example$ putout example.js /home/coderaiser/example/example.js 1:6 error "x" is defined but never used remove-unused-variables 1:13 error "y" is defined but never used remove-unused-variables 6:0 error Unexpected "console" call remove-console 1:0 error variables should be declared separately split-variable-declarations 3:6 error Object destructuring should be used apply-destructuring 4:6 error Object destructuring should be used apply-destructuring 6 errors in 1 files fixable with the `--fix` option 

рд╣рдо 6 рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдорд╛рдиреА рдЧрдИ рд╣реИ, рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ:


 coderaiser@cloudcmd:~/example$ putout example.js --fix coderaiser@cloudcmd:~/example$ cat example.js const { name, password } = user; 

рд╕реБрдзрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдФрд░ console.log рдХреЙрд▓ рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдереЗ, рдФрд░ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣рдореЗрд╢рд╛ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП .putout.json рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдЕрдиреБрднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


  • рдирд┐рдпрдо
  • рдЙрдкреЗрдХреНрд╖рд╛
  • рдореИрдЪ
  • рдкреНрд▓рдЧрдЗрдиреНрд╕

рдирд┐рдпрдо

rules рдЕрдиреБрднрд╛рдЧ рдореЗрдВ rules рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реЛрддреА рд╣реИред рдирд┐рдпрдо, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ:


 { "rules": { "remove-unused-variables": true, "remove-debugger": true, "remove-only": true, "remove-skip": true, "remove-process-exit": false, "remove-console": true, "split-variable-declarations": true, "remove-empty": true, "remove-empty-pattern": true, "convert-esm-to-commonjs": false, "apply-destructuring": true, "merge-destructuring-properties": true } } 

remove-process-exit рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП remove-process-exit рдЗрд╕реЗ .putout.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ true рд╕реЗрдЯ рдХрд░реЗрдВ:


 { "rules": { "remove-process-exit": true } } 

рдпрд╣ рд╕рднреА process.exit рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ process.exit рдХреЛрдб рдореЗрдВ рдкрд╛рдП рдЧрдП рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдпрджрд┐ --fix рд╡рд┐рдХрд▓реНрдк рдХрд╛ --fix рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрдВред


рдЙрдкреЗрдХреНрд╖рд╛

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ ignore рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ:


 { "ignore": [ "test/fixture" ] } 

рдореИрдЪ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╢рд╛рдЦрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ bin рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП process.exit рд╕рдХреНрд╖рдо рдХрд░реЗрдВ, рдмрд╕ match рд╕реЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 { "match": { "bin": { "remove-process-exit": true, } } } 

рдкреНрд▓рдЧрдЗрдиреНрд╕

рдпрджрд┐ рдЖрдк рдЙрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЙрдкрд╕рд░реНрдЧ putout-plugin- рдкреНрд▓рдЧ-рдЗрди рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ rules рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ plugins рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, putout-plugin-add-hello-world рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ add-hello-world рдирд┐рдпрдо рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ add-hello-world , рдмрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:


 { "rules": { "add-hello-world": true }, "plugins": [ "add-hello-world" ] } 

рдкреБрдЯрдЖрдЙрдЯ рдЗрдВрдЬрди


putout рдЗрдВрдЬрди рдПрдХ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЯреВрд▓ рд╣реИ рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИред


рд╡рд╣ рд░рд┐рдХреИрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ: рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж, рдХреЛрдб рдХреЛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИред


рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ ESTree рд╕рдВрдЧрдд рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ estree рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде estree , рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрднрд╡ рд╣реИ), рдФрд░ babel рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рд▓рдХреБрд▓ babel рдХреНрдпреЛрдВ? рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрдкрд╛рдж рд╣реИ, рдЕрдиреНрдп рд╕рдорд╛рди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред EcmaScript рдорд╛рдирдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдмреЗрдмрд▓ рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ред рдмреИрдмреЗрд▓ рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреБрд╕реНрддрдХ, рдмреИрдмрд▓ рд╣реИрдВрдбрдмреБрдХ рднреА рд╣реИ , рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХ рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдХреЛ рдкреАрдЫреЗ рд╣рдЯрд╛рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред


рдкреБрдЯрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдкреНрд▓рдЧрдЗрди


putout рдкреНрд▓рдЧрдЗрди рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╣реА рдПрд╕реНрдХрд┐рд▓реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреИрдмрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╕рдЪ рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, putout рдкреНрд▓рдЧрдЗрди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП 3. рдпрд╣ рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 3 рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдбрд╛рд▓рдирд╛ рдФрд░ рдмрд╕ рдЗрд╕реЗ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред


рдкреНрд▓рдЧрдЗрди рд╕рдВрд░рдЪрдирд╛

рддреЛ Putout рдкреНрд▓рдЧрдЗрди рдореЗрдВ 3 рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ:


  • report - рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ;
  • find - рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • fix - рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ fix рдХрд░рддрд╛ рд╣реИ;

putout рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рддреЗ рд╕рдордп рдпрд╛рдж рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдЗрд╕рдХрд╛ рдирд╛рдо рд╣реИ, рдЗрд╕реЗ putout-plugin- рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП-ред рдЕрдЧрд▓рд╛ рдЙрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд▓рдЧрдЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, remove-wrong рдкреНрд▓рдЧрдЗрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: putout-plugin-remove-wrong ред


рдЖрдкрдХреЛ рд╢рдмреНрджреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП: keywords рдЕрдиреБрднрд╛рдЧ рдореЗрдВ peerDependencies рдЕрдиреБрднрд╛рдЧ рдореЗрдВ peerDependencies рдФрд░ peerDependencies putout-plugin , рдФрд░ peerDependencies рдореЗрдВ "putout": ">=3.10" peerDependencies "putout": ">=3.10" рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ "putout": ">=3.10" , рдпрд╛ рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп рд╣реЛрдЧрд╛ред


рдкреБрдЯрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рдкреНрд▓рдЧрдЗрди

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рд╕реЗ debugger рд╢рдмреНрдж рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдРрд╕рд╛ рдкреНрд▓рдЧрдЗрди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдпрд╣ @ putout / plugin-remove-debugger рд╣реИ рдФрд░ рдЕрдм рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 //        module.exports.report = () => 'Unexpected "debugger" statement'; //     ,  debugger    Visitor module.exports.find = (ast, {traverse}) => { const places = []; traverse(ast, { DebuggerStatement(path) { places.push(path); } }); return places; }; //  ,     module.exports.fix = (path) => { path.remove(); }; 

рдпрджрд┐ remove-debugger рдирд┐рдпрдо рдХреЛ .putout.json рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ .putout.json , рддреЛ @putout/plugin-remove-debugger рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, find рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ traverse рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдПрд╕рдЯреА рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред


рдЕрдЧрд▓рд╛ рдЪрд░рдг putout рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП report рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред


рдпрджрд┐ - --fix рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд▓рдЧ fix рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдиреЛрдб рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдкреНрд▓рдЧрдЗрди рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг

рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, @ рдкреБрдЯрдЖрдЙрдЯ / рдЯреЗрд╕реНрдЯ рдЯреВрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ, рдпрд╣ рдЯреЗрдк рдХреЗ рдКрдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред


remove-debugger рдкреНрд▓рдЧ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 const removeDebugger = require('..'); const test = require('@putout/test')(__dirname, { 'remove-debugger': removeDebugger, }); //        test('remove debugger: report', (t) => { t.reportCode('debugger', 'Unexpected "debugger" statement'); t.end(); }); //    test('remove debugger: transformCode', (t) => { t.transformCode('debugger', ''); t.end(); }); 

Codemods

рд╣рд░ рдмрд╛рд░ рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдПрдХ рдмрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди ~/.putout рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп npm рдЗрд╕реЗ ~/.putout ред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, putout рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦреЗрдЧрд╛, putout рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рд╢реБрд░реВ рдХрд░реЗрдВред


рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬреЛ tape рдФрд░ рдЯреНрд░рд╛рдЗ -рдЯреВ-рдЯреЗрдк рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реБрдкрд░ - рд░реИрдк рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИ : рдХрдиреНрд╡рд░реНрдЯ-рдЯреЗрдк-рдЯреВ-рд╕реБрдкрд░-рд░реИрдк ред


eslint-рдкреНрд▓рдЧрдЗрди-putout


рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: putout рдХреЛрдб рдХреЛ рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рджреЛрд╕реНрдд рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рд╛рд░реВрдкрдг рдирд┐рдпрдо рдЯреВрдЯрддреЗ рд╣реИрдВ, рддреЛ eslint --fix eslint --fix рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ eslint-plugin-putout рдкреНрд▓рдЧрдЗрди рд╣реИ ред рдпрд╣ рдХрдИ рдкреНрд░рд╛рд░реВрдкрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрдЬреНрдЬреНрд╡рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд╡рд░реАрдпрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ:


 { "extends": [ "plugin:putout/recommended", ], "plugins": [ "putout" ] } 

рдЕрдм рддрдХ, рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдо рд╣реИ: one-line-destructuring , рдпрд╣ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:


 //  const { one } = hello; //  const {one} = hello; 

рдРрд╕реЗ рдХрдИ рдФрд░ рдирд┐рдпрдо рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЖрдк рдЦреБрдж рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВ рдЗрд╕ рдкрд╛рда рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд┐рд╖рдп рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдЖрдХрд░реНрд╖рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдЕрдзрд┐рдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдореИрдВ putout рдХреЗ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдирд╛рдПрдБ , рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдПрдХ рдкреВрд▓ рднреЗрдЬреЗрдВ , рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ, рд▓рд┐рдЦреЗрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдирд┐рдпрдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░реЗрдВ, рд╣рдо рдПрдПрд╕рдЯреА рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдЯреВрд▓ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi439564/


All Articles