แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒงแƒแƒ แƒ” แƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜, แƒกแƒแƒ“แƒแƒช แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒงแƒ” แƒ˜แƒงแƒ (แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ tslint, prettier แƒ“แƒ แƒ.แƒจ.)

แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ. แƒ“แƒแƒ แƒฉแƒ˜แƒ— แƒ™แƒแƒœแƒขแƒแƒฅแƒขแƒ–แƒ”. แƒแƒ›แƒ”แƒšแƒœแƒ˜แƒชแƒ™แƒ˜ แƒกแƒ”แƒ แƒ’แƒ”แƒ˜แƒ“แƒฆแƒ”แƒก แƒ›แƒ” แƒ’แƒแƒ’แƒ˜แƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒ— แƒฉแƒ”แƒ›แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ— แƒ—แƒแƒ•แƒ˜แƒก แƒขแƒ™แƒ˜แƒ•แƒ˜แƒšแƒก, แƒ™แƒ”แƒ แƒซแƒแƒ“ - แƒ แƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ—, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒžแƒ แƒแƒ”แƒฅแƒขแƒก แƒฌแƒ”แƒ แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ“แƒแƒœแƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒ˜ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒฃแƒ—แƒฎแƒแƒ•แƒแƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒงแƒแƒ แƒ” แƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜, แƒกแƒแƒ“แƒแƒช แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒงแƒ” แƒ˜แƒงแƒ (แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ tslint, prettier แƒ“แƒ แƒ.แƒจ.)

แƒ˜แƒกแƒ” แƒ›แƒแƒฎแƒ“แƒ, แƒ แƒแƒ› แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฉแƒ”แƒ›แƒก แƒ’แƒฃแƒœแƒ“แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒ•แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ˜, แƒกแƒแƒ“แƒแƒช แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒจแƒ”แƒ•แƒ—แƒแƒœแƒฎแƒ›แƒ“แƒ˜แƒ— แƒ“แƒ˜แƒ–แƒแƒ˜แƒœแƒ˜แƒก, แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก, แƒฉแƒแƒฆแƒ แƒ›แƒแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ.แƒจ. แƒฌแƒ”แƒกแƒ”แƒ‘แƒ–แƒ”. แƒจแƒ”แƒ•แƒ”แƒฉแƒ•แƒ˜แƒ”แƒ— แƒ›แƒแƒ— แƒ“แƒ แƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“ แƒ•แƒชแƒฎแƒแƒ•แƒ แƒแƒ‘แƒ“แƒ˜แƒ—. แƒฉแƒ”แƒ›แƒ˜ แƒกแƒ˜แƒฎแƒแƒ แƒฃแƒšแƒ˜แƒ—, แƒกแƒขแƒแƒขแƒ˜แƒแƒช แƒ™แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ” แƒฐแƒแƒ‘แƒ แƒ–แƒ”. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒขแƒ˜แƒšแƒ˜แƒแƒกแƒ” แƒ แƒแƒ›, แƒ แƒแƒฆแƒแƒช แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—, tslint แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ—.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒ’แƒแƒ•แƒ˜แƒ–แƒแƒ แƒ“แƒ”แƒ—. แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒแƒฎแƒแƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜แƒ— แƒ“แƒ แƒ›แƒแƒก แƒแƒฎแƒแƒšแƒ˜ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜, 4 แƒ™แƒแƒ แƒ’แƒ˜ แƒ—แƒแƒœแƒแƒ›แƒแƒแƒ–แƒ แƒ”. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒ แƒแƒฆแƒแƒช แƒแƒ แƒแƒกแƒฌแƒแƒ แƒแƒ“ แƒฌแƒแƒ แƒ˜แƒ›แƒแƒ แƒ—แƒ.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒงแƒแƒ แƒ” แƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜, แƒกแƒแƒ“แƒแƒช แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒงแƒ” แƒ˜แƒงแƒ (แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ tslint, prettier แƒ“แƒ แƒ.แƒจ.)

แƒ•แƒคแƒ˜แƒฅแƒ แƒแƒ‘, แƒ‘แƒ”แƒ•แƒ แƒ›แƒ แƒ˜แƒชแƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜แƒ— แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒกแƒแƒฎแƒแƒšแƒ˜แƒกแƒ แƒแƒ  แƒแƒ แƒ˜แƒก. แƒ›แƒ” แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ›แƒแƒฎแƒกแƒแƒ•แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒแƒฆแƒคแƒ แƒ—แƒแƒ•แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ˜แƒงแƒแƒ•แƒ˜ แƒ“แƒ แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ˜... แƒ›แƒแƒจ, แƒ แƒแƒ–แƒ” แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ“แƒ˜?) แƒแƒฐ, แƒ™แƒ˜.

แƒ’แƒฃแƒšแƒฌแƒ แƒคแƒ”แƒšแƒแƒ“ แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒก แƒแƒ  แƒฌแƒแƒ แƒ›แƒแƒแƒ“แƒ’แƒ”แƒœแƒ“แƒ, แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒ™แƒ แƒ”แƒคแƒ แƒ™แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒชแƒœแƒ”แƒ‘แƒแƒ“ แƒ˜แƒฅแƒชแƒ. แƒ แƒแƒฆแƒแƒช แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜ แƒ“แƒ”แƒžแƒ แƒ”แƒกแƒ˜แƒแƒจแƒ˜ แƒฉแƒแƒ•แƒ•แƒแƒ แƒ“แƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ“แƒ˜แƒ–แƒแƒ˜แƒœแƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ, แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒแƒ“แƒ, แƒแƒ™แƒ แƒ”แƒคแƒ - แƒ แƒ แƒแƒ แƒ˜แƒก แƒ”แƒก?). แƒ แƒแƒฆแƒแƒช แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒงแƒ แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒกแƒแƒช แƒแƒ  แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒขแƒแƒžแƒ˜แƒก แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ:

  • แƒฉแƒ•แƒ”แƒœ tslint แƒ“แƒแƒ•แƒงแƒแƒ•แƒ˜แƒ— แƒ แƒ‘แƒ˜แƒš แƒฌแƒ”แƒกแƒ”แƒ‘แƒแƒ“ (แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก) แƒ“แƒ แƒ›แƒ™แƒแƒชแƒ  แƒฌแƒ”แƒกแƒ”แƒ‘แƒแƒ“ (ide-แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ—แƒ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒก แƒจแƒ”แƒแƒฎแƒกแƒ”แƒœแƒแƒœ, แƒ แƒ แƒ“แƒแƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒแƒ—).

  • แƒ•แƒแƒ  แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ hard tslint-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒกแƒแƒซแƒšแƒ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒแƒ–แƒ”.

  • แƒ“แƒแƒฌแƒ”แƒ แƒ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒฃแƒคแƒ แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

  • แƒ“แƒแƒ˜แƒ แƒแƒ–แƒ” แƒชแƒ”แƒ™แƒ•แƒแƒ•แƒ“แƒ, แƒ แƒแƒ› แƒšแƒ˜แƒœแƒขแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ”แƒจแƒ•แƒ แƒšแƒ˜แƒœแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒ“แƒ’แƒ›แƒฃแƒšแƒ˜

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜: แƒ’แƒแƒงแƒแƒ•แƒ˜ แƒ“แƒ แƒ˜แƒ‘แƒแƒขแƒแƒœแƒ”

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒšแƒ˜แƒœแƒขแƒ”แƒ แƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ™แƒแƒชแƒ แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ“แƒ”แƒ แƒ›แƒแƒ›แƒ˜แƒ•แƒ˜แƒ“แƒ แƒ—แƒแƒ•แƒจแƒ˜, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”, แƒ แƒแƒ› แƒ—แƒแƒ•แƒก แƒฉแƒแƒ›แƒแƒ•แƒ˜แƒฎแƒ แƒฉแƒแƒ‘แƒ“แƒ˜แƒ—. แƒ™แƒแƒ“แƒ˜ แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ. แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒ’แƒ”แƒ‘แƒแƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒ“แƒ แƒแƒกแƒ”แƒ— แƒขแƒแƒ›แƒจแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒแƒ แƒฎแƒฃแƒšแƒ˜แƒงแƒแƒ•แƒ˜. แƒ’แƒแƒ“แƒแƒฌแƒงแƒ“แƒ, แƒ แƒแƒ› IDE-แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒšแƒ˜แƒœแƒขแƒ”แƒ แƒ˜ แƒจแƒ”แƒ’แƒ•แƒ”แƒฅแƒ›แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ—แƒ•แƒแƒšแƒจแƒ˜ แƒกแƒแƒชแƒ”แƒ›แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ แƒ“แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก jsdoc-แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒแƒก, แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒแƒœ แƒฌแƒแƒ แƒฃแƒ›แƒแƒขแƒ”แƒ‘แƒ”แƒšแƒ˜ onPush-แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒแƒก แƒ“แƒ แƒ.แƒจ.

แƒแƒกแƒ” แƒ แƒแƒ›, root-แƒจแƒ˜ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ— 2 tslin แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒฅแƒแƒœแƒ:

tsconfig.json

{
  "rulesDirectory": [
    "node_modules/codelyzer"
  ],
  "rules": {
    "arrow-return-shorthand": true,
    "callable-types": true,
    "class-name": true,
    "comment-format": [
      true,
      "check-space"
    ],
    "curly": true,
    "deprecation": {
      "severity": "warn"
    },
    "eofline": true,
    "forin": true,
    "import-blacklist": [
      true,
      "rxjs/Rx"
    ],
    "import-spacing": true,
    "indent": [
      true,
      "spaces"
    ],
    "interface-over-type-literal": true,
    "label-position": true,
    "max-line-length": [
      true,
      200
    ],
    "member-access": false,
    "member-ordering": [
      true,
      {
        "order": [
          "static-field",
          "instance-field",
          "static-method",
          "instance-method"
        ]
      }
    ],
    "no-arg": true,
    "no-bitwise": true,
    "no-console": [
      true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-super": true,
    "no-empty": false,
    "no-empty-interface": true,
    "no-eval": true,
    "no-inferrable-types": [
      false,
      "ignore-params"
    ],
    "no-duplicate-imports": true,
    "no-misused-new": true,
    "no-non-null-assertion": true,
    "no-redundant-jsdoc": true,
    "no-shadowed-variable": false,
    "no-string-literal": false,
    "no-string-throw": true,
    "no-switch-case-fall-through": true,
    "no-trailing-whitespace": [
      true,
      "ignore-comments",
      "ignore-jsdoc"
    ],
    "no-unnecessary-initializer": true,
    "no-unused-expression": true,
    "no-use-before-declare": false,
    "no-var-keyword": true,
    "object-literal-sort-keys": false,
    "one-line": [
      true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-whitespace"
    ],
    "prefer-const": true,
    "quotemark": [
      true,
      "single"
    ],
    "radix": false,
    "semicolon": [
      true,
      "always"
    ],
    "triple-equals": [
      true,
      "allow-null-check"
    ],
    "typedef-whitespace": [
      true,
      {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      }
    ],
    "unified-signatures": true,
    "variable-name": false,
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ],
    "directive-selector": [
      true,
      "attribute",
      "app",
      "camelCase"
    ],
    "component-selector": [
      true,
      "element",
      "app",
      "kebab-case"
    ],
    "no-output-on-prefix": false,
    "no-inputs-metadata-property": true,
    "no-outputs-metadata-property": true,
    "no-host-metadata-property": true,
    "no-input-rename": false,
    "no-output-rename": true,
    "use-lifecycle-interface": true,
    "use-pipe-transform-interface": true,
    "component-class-suffix": true,
    "directive-class-suffix": true,
    "no-consecutive-blank-lines": true
  }
}

tslint.ide_only.json

{
  "rulesDirectory": [
    "node_modules/codelyzer"
  ],
  "rules": {
    "completed-docs": [
      true,
      {
        "properties": true,
        "methods": true
      }
    ],
    "no-angle-bracket-type-assertion": true,
    "no-any": true,
    "prefer-output-readonly": true,
    "prefer-on-push-component-change-detection": true,
    "array-type": [
      true,
      "array"
    ],
    "typedef": [
      true,
      "call-signature",
      "arrow-call-signature"
    ],
    "arrow-return-shorthand": true,
    "callable-types": true,
    "class-name": true,
    "comment-format": [
      true,
      "check-space"
    ],
    "curly": true,
    "deprecation": {
      "severity": "warn"
    },
    "eofline": true,
    "forin": true,
    "import-blacklist": [
      true,
      "rxjs/Rx"
    ],
    "import-spacing": true,
    "indent": [
      true,
      "spaces"
    ],
    "interface-over-type-literal": true,
    "label-position": true,
    "max-line-length": [
      true,
      200
    ],
    "member-access": [
      true,
      "check-parameter-property",
      "check-accessor"
    ],
    "member-ordering": [
      true,
      {
        "order": [
          "public-static-field",
          "protected-static-field",
          "private-static-field",
          "public-instance-field",
          "protected-instance-field",
          "private-instance-field",
          "constructor",
          "public-static-method",
          "protected-static-method",
          "private-static-method",
          "public-instance-method",
          "protected-instance-method",
          "private-instance-method"
        ]
      }
    ],
    "no-arg": true,
    "no-bitwise": true,
    "no-console": true,
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-super": true,
    "no-empty": false,
    "no-empty-interface": true,
    "no-duplicate-switch-case": true,
    "no-eval": true,
    "no-inferrable-types": [
      false,
      "ignore-params"
    ],
    "no-duplicate-imports": true,
    "one-variable-per-declaration": true,
    "no-misused-new": true,
    "no-non-null-assertion": true,
    "prefer-template": [
      true,
      "allow-single-concat"
    ],
    "ordered-imports": true,
    "no-redundant-jsdoc": true,
    "no-shadowed-variable": false,
    "no-string-literal": false,
    "no-string-throw": true,
    "no-switch-case-fall-through": true,
    "no-trailing-whitespace": [
      true,
      "ignore-comments",
      "ignore-jsdoc"
    ],
    "ban": [
      true,
      {
        "name": [
          "Object",
          "assign"
        ],
        "message": "ะ˜ัะฟะพะปัŒะทัƒะนั‚ะต cloneDeep (lodash) ะดะปั ะบะพะฟะธั€ะพะฒะฐะฝะธั ะพะฑัŠะตะบั‚ะฐ"
      }
    ],
    "max-classes-per-file": [
      true,
      1
    ],
    "cyclomatic-complexity": [
      true,
      6
    ],
    "static-this": true,
    "no-unnecessary-initializer": true,
    "no-unused-expression": true,
    "no-var-keyword": true,
    "object-literal-sort-keys": false,
    "one-line": [
      true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-whitespace"
    ],
    "prefer-const": true,
    "quotemark": [
      true,
      "single"
    ],
    "radix": false,
    "semicolon": [
      true,
      "always"
    ],
    "triple-equals": [
      true,
      "allow-null-check"
    ],
    "typedef-whitespace": [
      true,
      {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      }
    ],
    "unified-signatures": true,
    "variable-name": false,
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ],
    "directive-selector": [
      true,
      "attribute",
      "app",
      "camelCase"
    ],
    "component-selector": [
      true,
      "element",
      "app",
      "kebab-case"
    ],
    "no-output-on-prefix": false,
    "no-inputs-metadata-property": true,
    "no-outputs-metadata-property": true,
    "no-host-metadata-property": true,
    "no-input-rename": false,
    "no-output-rename": true,
    "use-lifecycle-interface": true,
    "use-pipe-transform-interface": true,
    "component-class-suffix": true,
    "directive-class-suffix": true,
    "no-consecutive-blank-lines": true
  }
}

แƒคแƒแƒ˜แƒšแƒจแƒ˜ src/tslint แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ tslint ID-แƒ—แƒ˜ แƒฉแƒแƒ•แƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ—

src/tslint.json

{
    "extends": "../tslint.ide_only.json",
    "rules": {
        "directive-selector": [
            true,
            "attribute",
            "app",
            "camelCase"
        ],
        "component-selector": [
            true,
            "element",
            "app",
            "kebab-case"
        ]
    }
}

แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ linter-แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ package.json แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒจแƒ˜.

ng lint --tslint-config ./tslint.json --fix`

แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ— แƒฎแƒแƒ–แƒ’แƒแƒกแƒ›แƒฃแƒšแƒ˜ แƒœแƒ˜แƒ•แƒ—แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒ—แƒแƒ•แƒ˜แƒก แƒฉแƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ—แƒ แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒแƒช แƒกแƒแƒญแƒ˜แƒ แƒ แƒ˜แƒงแƒ.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒ›แƒ”แƒแƒ แƒ” - แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒงแƒแƒ แƒ” แƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜, แƒกแƒแƒ“แƒแƒช แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒงแƒ” แƒ˜แƒงแƒ (แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ tslint, prettier แƒ“แƒ แƒ.แƒจ.)

tslint-แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒแƒฅแƒ•แƒก has fixer. แƒ›แƒแƒจ แƒแƒกแƒ”, แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ—.

tslint --project tslint.ide_only.json --fix --force

แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ— Hard Linter แƒฌแƒ”แƒกแƒ”แƒ‘แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ™แƒแƒ แƒ”แƒฅแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ•แƒ”แƒฃแƒ‘แƒœแƒ”แƒ‘แƒ˜แƒ— แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒแƒก, แƒ แƒแƒ› แƒแƒ  แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜ (แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒ˜แƒ–แƒแƒœแƒ˜ แƒแƒฅ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ™แƒแƒ แƒ”แƒฅแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒ).

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒ›แƒ”แƒกแƒแƒ›แƒ”: แƒšแƒแƒ›แƒแƒ–แƒแƒ“ แƒ“แƒแƒฌแƒ”แƒ แƒ”แƒ—

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒแƒ•แƒ˜แƒกแƒ”แƒ‘แƒฃแƒ แƒแƒ“ แƒฌแƒ”แƒ แƒก, แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒ”แƒก แƒ“แƒแƒ›แƒฆแƒšแƒ”แƒšแƒ˜ แƒฎแƒ“แƒ”แƒ‘แƒ. แƒ™แƒแƒ“แƒ˜ แƒ˜แƒกแƒ” แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฌแƒ”แƒ แƒแƒก, แƒ แƒแƒ› แƒฉแƒแƒœแƒ“แƒ”แƒก, แƒ—แƒ˜แƒ—แƒฅแƒแƒก แƒ›แƒแƒก แƒ”แƒ แƒ—แƒ˜ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ˜ แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก. แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ” แƒ“แƒแƒ•แƒฃแƒ แƒ—แƒ” แƒฃแƒคแƒ แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒ—:

.prettierr.yaml

printWidth: 200     # ะœะฐะบัะธะผะฐะปัŒะฝะพะต ะบะพะป-ะฒะพ ัะธะผะฒะพะปะพะฒ ะฒ ัั‚ั€ะพะบะต
tabWidth: 2         # ะŸั€ะพะฑะตะปะพะฒ ะฒ ะขะฐะฑะต
singleQuote: true   # ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝะฐั€ะฝั‹ะต ะบะฐะฒั‹ั‡ะบะธ
trailingComma: all  # ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะทะฐะฟัั‚ั‹ะต ะณะดะต ะฒะพะทะผะพะถะฝะพ
arrowParens: always # ะกั‚ั€ะตะปะพั‡ะฝั‹ะต ั„-ะธะธ ะฒั‹ะณะปัะดัั‚ (x) => x
overrides:
  - files: "*.ts"   # ะŸั€ะพะฒะตั€ะบะฐ ั„ะฐะนะปะพะฒ *.ts
    options:
      parser: typescript  # ะฏะทั‹ะบ ะฒ ั„ะฐะนะปะฐั… *.ts

แƒ“แƒ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ” แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ: prettier --write --config .prettierr.yaml

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒ›แƒ”แƒแƒ—แƒฎแƒ” - แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒแƒ— แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜?

แƒแƒฎแƒšแƒ แƒ™แƒ˜ แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜. แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒ›แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜:

npm i -D prettier lint-staged husky

husky-แƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒก git hook-แƒ–แƒ” - pre-commit แƒ“แƒแƒ•แƒ™แƒ˜แƒ“แƒ”แƒ‘แƒ—. lint-staged แƒ’แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— (แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒฉแƒแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒก แƒแƒ› แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒจแƒ˜).

แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒœแƒ“แƒ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ’แƒแƒ›แƒแƒ•แƒงแƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฌแƒแƒ•แƒแƒฌแƒงแƒ“แƒ˜. แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— ng lint-แƒก. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒก lint-staged-แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ—, แƒฉแƒ•แƒ”แƒœแƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒแƒก แƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒ›แƒแƒ“แƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜. ng lint-แƒก แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒฅแƒ•แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜. --files, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ” แƒ›แƒ”แƒกแƒ›แƒ˜แƒก, แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒแƒ‘แƒšแƒ˜แƒแƒ‘แƒแƒก แƒ•แƒ”แƒ  แƒฎแƒ”แƒ“แƒแƒ•แƒก แƒ“แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒคแƒแƒ˜แƒšแƒก แƒ”แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฃแƒ›แƒแƒขแƒแƒก. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ›แƒแƒ›แƒ˜แƒฌแƒ˜แƒ:

lint.sh

#!/bin/bash

PROJECT=$1
shift
SOURCES=$@
DESTINATIONS=""
DELIMITER=""

for src in $SOURCES
do
    DELIMITER=" --files "
    DESTINATIONS="$DESTINATIONS$DELIMITER${src}"
done

ng lint $PROJECT --tslint-config ./tslint.json $DESTINATIONS

แƒแƒ› แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“, แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒแƒ—. แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜แƒ. angular.json แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒแƒจแƒ˜. แƒฉแƒ”แƒ›แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ”แƒก แƒแƒ แƒ˜แƒก partner-account ะธ partner-account-e2eแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ.

แƒ“แƒแƒ•แƒฃแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ— แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก. แƒฉแƒ•แƒ”แƒœแƒ˜ package.json แƒแƒฎแƒšแƒ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged --relative"
    }
  },
  "lint-staged": {
    "*.{ts,js}": [
      "prettier --write --config .prettierr.yaml",
      "tslint --project tslint.ide_only.json --fix --force",
      "sh lint.sh partner-account",
      "git add"
    ],
    "*.{html,scss,css}": [
      "prettier --write --config .prettierr.yaml",
      "git add"
    ]
  },

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ lint-staged --relative... แฒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ --relative แƒกแƒแƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒแƒ แƒ˜แƒฅ. แƒแƒฎแƒšแƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒ—, แƒ˜แƒก แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ lint-stagedแƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ• แƒ˜แƒ แƒฉแƒ”แƒ•แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒ“แƒ แƒ›แƒแƒ—แƒ–แƒ” แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒแƒก แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก.

แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒ”แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒแƒก แƒแƒ  แƒแƒฃแƒฅแƒ›แƒ”แƒ‘แƒก, แƒ—แƒฃแƒ›แƒชแƒ แƒ˜แƒก แƒ’แƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ— แƒฃแƒคแƒ แƒ แƒ›แƒ™แƒแƒคแƒ˜แƒ แƒ’แƒแƒฎแƒ“แƒ. แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ•, แƒ แƒแƒ› แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ“แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก, แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒจแƒ”แƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒœแƒแƒ›แƒฃแƒจแƒ”แƒ•แƒแƒ แƒ˜ แƒ”แƒ แƒ—แƒ˜ แƒกแƒขแƒ˜แƒšแƒ˜แƒ— แƒ“แƒแƒ˜แƒฌแƒ”แƒ แƒ (แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก ๐Ÿ˜€).

P.S. - แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒก PM-แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก ๐Ÿ”ฅ แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒ—, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜ | ProHoster