рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреИрдирд╛рддреА, CI рдФрд░ рдбреЗрдореЛ (рдЬреАрд╡рди рдореЗрдВ рдЦреБрд╢реА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛) рдХреЗ рд╕рд╛рде рдПрдХ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдХреИрд╕реЗ рдЦреЛрд▓реЗрдВ

рддреЛ рдЖрдкрдиреЗ рдХреБрдЫ рдирдпрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛, рд╕реЛрдЪрд╛ рдКрдкрд░ рдЖрддрд╛ рд╣реИ - рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдФрд░ npm рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред


рдмрд╕ рдХреЛрдб рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рдзрдХреЗрд▓рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреА рдХрдореА рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рдХрдИ рдЙрдмрд╛рдК рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдпрд╛рдж рд╣реИрдВ: рдкреИрдХреЗрдЬ рдмрдирд╛рдирд╛ рдФрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛, рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдирд╛, рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдкреЗрдЬреЛрдВ рдХреА рддреИрдирд╛рддреА рдХрд░рдирд╛ рдФрд░ рдЙрдирдХреА рддреИрдирд╛рддреА рдХрд░рдирд╛, рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдпреЛрдЧрджрд╛рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ред


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


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рднреА рдХрдо рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред DevOps рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрдХреНрддред




рд╣рдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддреЗ рд╣реИрдВ


рдпрджрд┐ рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдореИрдВ рдорд╛рдирдХ-рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдкреИрдХреЗрдЬ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛: рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЖрдЧрдЬрдиреА, git рдореЗрдВ CHANGELOG.md рдлрд╝рд╛рдЗрд▓ рдФрд░ affix рд╕рдВрд╕реНрдХрд░рдг рдЯреИрдЧ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред


рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдХрдиреНрд╡реЗрдВрд╢рдирд▓ рдХрдорд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рд▓рд╛рддрд╛ рд╣реИ: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЖрд╡рд╛рдЧрдорди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреАрдХреГрдд рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред


рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдЧреАрдердм рдкреГрд╖реНрда рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛрдбрд╝реЗрдВ:


"release": "standard-version", "release:patch": "npm run release -- --release-as patch", "release:minor": "npm run release -- --release-as minor", "release:major": "npm run release -- --release-as major", 

рд╕реАрдЖрдИ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ


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


  1. рдЬреАрдердм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ
  2. рд╕реВрдЪреА рд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрд╡рд┐рд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
  3. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрдиреНрдлрд┐рдЧрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕реЗ CI рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

     language: node_js node_js: - "10" script: - npm run lint - npm run build - npm run test:ci 

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


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




рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдВрдЧреЗ рдпрджрд┐ рд╡реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдХрд╡рд░реЗрдЬ рд╕реЗрд╡рд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╢рд┐рдлреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдЖрдИ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдЯреНрд░реИрд╡рд┐рд╕ рдиреЗ рдЙрд╕реЗ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╕ рдХрд░рдиреЗ рджрд┐рдпрд╛ред


рдХрд╡рд░рд▓реЗрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЪреЗрдХрдорд╛рд░реНрдХ рдбрд╛рд▓реЗрдВред рдЯреНрд░реИрд╡рд┐рд╕ рдХреА рддрд░рд╣ред


рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдУрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ:


  1. рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреЗрд╡-рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ coveralls рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  2. рдЖрд╡рд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ: ci

     "test:ci": "npm run test && npm run coveralls", "coveralls": "cat coverage/lcov.info | coveralls", 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ --code-coverage рд░рди рдЯреЗрд╕реНрдЯ рдХрдорд╛рдВрдб рдореЗрдВ --code-coverage рдлреНрд▓реИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Coveralls рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА lcov.info рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдЭрдВрдбрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реНрддрд╛рдирдмреБрд▓ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЯреНрд░реИрд╡рд┐рд╕ рдХреА рддрд░рдл рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:


рдпрджрд┐ рднрдВрдбрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрд▓рд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд╣реЗрдЧрд╛, рддреЛ рдЖрдк .travis.yml рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


 notifications: webhooks: https://coveralls.io/webhook 

рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:


  1. Coveralls рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд░реЗрдкреЛ рдЯреЛрдХрди рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ:



  2. рдЗрд╕ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде, рдЯреНрд░реИрд╡рд┐рд╕ рдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ COVERALLS_REPO_TOKEN рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдЦрдВрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред



рдЯреЛрдХрди рдиреЗ рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдирдП рдЯреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд╛рд╕реНрдЯрд░ рдмреНрд░рд╛рдВрдЪ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред


  1. рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╢рд╛рдЦрд╛рдУрдВ рдкрд░ рдЬрд╛рдПрдВ
  2. рд╕рднреА рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рдмрдирд╛рдПрдБ: *
  3. рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореИрдВ рднреА Coveralls рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд▓реМрдЯрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред PULL REQUESTS ALERTS рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Pull рдЕрдиреБрд░реЛрдз рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░реЗрдЬ рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХрд╛ рдкреИрдХреЗрдЬ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрд╛-рдкрд░рдЦрд╛ рд░рд╣реЗред


рдЕрдкрдиреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдмреНрд░рд╢ рдХрд░реЗрдВ


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


рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ .editorconfig рдлрд╝рд╛рдЗрд▓ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХрдо рдкрд░ рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:


 { ... "scripts": { ... "typecheck": "tsc --noEmit --skipLibCheck", }, "husky": { "hooks": { "pre-commit": "lint-staged && npm run typecheck" } }, "lint-staged": { "*.{js,ts,html,md,less,json}": [ "prettier --write", "git add" ], "*.ts": "tslint", "*.less": "stylelint" } } 

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


  • рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рд░реНрддреА
  • рдЬреЗрдПрд╕ / рдЯреАрдПрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрд╕реНрд▓рд┐рдВрдЯ рдпрд╛ tslint
  • рд╕реНрдЯрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рдЗрд▓рд▓рд┐рдВрдЯ

рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░-рддреИрдпрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣рдорд╛рд░реЗ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди @ tinkoff / linters рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдХрдиреЗрдХреНрд╢рди рддреАрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ:


.stylelintrc


 { "extends": ["@tinkoff/linters/stylelint/bases/prettier.stylelint.json"] } 

prettier.config.js


 module.exports = { ...require('@tinkoff/linters/prettier/prettier.config'), }; 

tslint.json


 { "extends": ["@tinkoff/linters/tslint/bases/prettier.tslint.json"] } 

рдПрдирдкреАрдПрдо рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ


рдЕрдм рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдкреИрдХреЗрдЬ-рдЬреНрд╕рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдФрд░ рд╕рд░рд▓ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ:


 "publish": "npm run build && npm publish ./dist" 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдПрдирдкреАрдПрдо рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдкреИрдХреЗрдЬ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред


рдЪрд▓реЛ npm рд╣реБрдХ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреЛрд╕реНрдЯрдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ README.md рдХреЛ рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдирдкреАрдПрдо рдкрд░ рдкреИрдХреЗрдЬ рд╡рд┐рд╡рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдХрднреА рдирд╣реАрдВ рднреВрд▓реЗрдВрдЧреЗред


 "build": "..", "postbuild": "node scripts/postbuild.js", 

рд▓рд┐рдкрд┐рдпреЛрдВ / рдкреЛрд╕реНрдЯрдмрд┐рд▓реНрдЯ .js


 const fs = require('fs'); const DIST_LIB_PATH = 'dist/'; const README_PATH = 'README.md'; const PATH_TO = DIST_LIB_PATH + README_PATH; copyReadmeIntoDistFolder(); function copyReadmeIntoDistFolder() { if (!fs.existsSync(README_PATH)) { throw new Error('README.md does not exist'); } else { fs.copyFileSync(README_PATH, PATH_TO); } } 

рдбреЗрдореЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВ


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


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


рдЖрдк рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдбреЗрдореЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдирдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдЖрдзреБрдирд┐рдХ рдСрдирд▓рд╛рдЗрди рдЖрдИрдбреАрдИ рдЖрдкрдХреЛ рдЬреАрдердм рд╕реЗ рд╕реАрдзреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдЗрд╕рдХреА рдЕрд▓рдЧ рд╢рд╛рдЦрд╛ / рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдПрдХ рд╕рд╛рде рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдкрд╛рдБрдЪ рдорд┐рдирдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛:


  • stackblitz.com рдЕрдм рдЖрдкрдХреЛ Angular, React, Ionic, TypeScript, RxJs рдФрд░ Svelte рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЬреАрдердм рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред
  • codeandbox.io рдиреЗ рднреА Angular, React, рдФрд░ Vue рд▓реЙрдиреНрдЪ рдХрд┐рдП рд╣реИрдВред рд╡рд╣ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рджреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдВрдХ рд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЦреБрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • repl.it рдЗрд╕ рд╕реЗрд╡рд╛ рдкрд░ рдЖрдк NodeJS, Express, NextJS, GatsbyJS рдХреЗ рд╕рд╛рде рдПрдХ рднрдВрдбрд╛рд░ рдХрд╛ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдХреЛрдИ рднреА рдЪреБрдиреЗрдВ, README рдореЗрдВ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдлрд┐рд░ рдХрднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдП рдЬрд╛рдПрдВрдЧреЗред


рдЖрдк CI рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдирдкреАрдПрдо рдореЗрдВ рдкреИрдХреЗрдЬ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЕрдВрддрд┐рдо рдорд╛рд░рдлреЗрдЯ


README.md рдореЗрдВ рдмреИрдЬ рдЬреЛрдбрд╝реЗрдВред рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЦреБрдж рдХреЛ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдХреЗ рдЖрдЧрдВрддреБрдХ рдХреЛ рдЧреАрдердм рдкрд░ рдЙрдиреНрдореБрдЦ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред


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



рдмреИрдЬ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ Shields.io рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ ред рд╡реЗ рд╕рд░рд▓ рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╣реИрдВред


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


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


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

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


All Articles