рдореИрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рд░рдЦрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣рд╛рдереЛрдВ рдХрд╛ рдЬрдВрдЧрд▓ рд╣реИ (tslint, prettier, рдЖрджрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕)

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



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


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



рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рдпрд╛рдж рдореЗрдВ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд┐рд▓реА, рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЦреБрд╢ рдерд╛, рдФрд░ рдмрд╛рдХреА ... рддреЛ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?) рдУрд╣ рд╣рд╛рдВред


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


рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЪрд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:
  • рд╣рдордиреЗ tslint рдХреЛ рдирд░рдо рдирд┐рдпрдореЛрдВ (рдкреВрд░реНрд╡-рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рд▓рд┐рдП) рдФрд░ рдХрдард┐рди рдирд┐рдпрдореЛрдВ (рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдпрд╛рдж рджрд┐рд▓рд╛рдПрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреНрдпрд╛ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИред


  • рдХрдард┐рди tslint рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдкреВрд░реНрд╡-рдкреНрд░рддрд┐рдмрджреНрдз рдСрдЯреЛрдлрд┐рдХреЗрд╢рди рдкрд░ рд▓рдЯрдХрд╛рдПрдВ


  • рдкреНрд░реАрдЯрд┐рдпрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд▓рд┐рдЦреЗ


  • рдПрдХ рдЯреИрдВрдмреЛрд░рд╛рдЗрди рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдЯ-рдордВрдЪрд┐рдд рдПрдирдЬреА рд▓рд┐рдВрдЯ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдХрд┐рдпрд╛



рдЪрд░рдг рдПрдХ - рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдЬреАрддреЗрдВ


рдЬрдм рдореБрдЭреЗ рд▓рд┐рдВрдЯрд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдХрд╕рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛, рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╣рдо рдЦреБрдж рдХреЛ рд▓рдЯрдХрд╛ рд▓реЗрдВрдЧреЗред рдХреЛрдб рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдРрд╕реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЖрдк рдЦреБрджрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░рд╛ рд▓рд┐рдВрдЯрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдПрдХ рдЖрдВрдЦ рдХреА рд░реЛрд╢рдиреА рдФрд░ рддрд░реАрдХреЛрдВ рдФрд░ sv-c рдХреЗ рд▓рд┐рдП jsdoc рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдЧрд╛, рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрд╢реБрдн onPush, рдЖрджрд┐ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рдЗрд╕рд▓рд┐рдП, рд░реВрдЯ рдореЗрдВ, рд╣рдордиреЗ 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 рдХреЛ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛


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

рдФрд░ package.json рдХреА рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдВрдЯрд░ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЛ рддрдп рдХрд┐рдпрд╛


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

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдЙрди рд░реЗрдЦрд╛рдВрдХрд┐рдд рдЪреАрдЬреЛрдВ рд╕реЗ рд▓рдЯрдХрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЪрд░рдг рджреЛ - рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВ



Tslint рдореЗрдВ has fixer рдирд┐рдпрдо рд╣реИрдВред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред


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

рдпрд╣рд╛рдВ рд╣рдо рдЙрдкрд▓рдмреНрдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдСрдЯреЛрдлрд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╣рд╛рд░реНрдб рд▓рд╛рдЗрдирд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрдорд╛рдВрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЕрднреА рднреА рдСрдЯреЛ-рдХрд░реЗрдХреНрд╢рди рдХрд░рдирд╛ рд╣реИ)ред


рдЪрд░рдг рддреАрди - рд╕реБрдВрджрд░ рд▓рд┐рдЦреЗрдВ


рдЬрдм рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдВрддрддрдГ рдердХ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдРрд╕рд╛ рд▓рдЧреЗ рдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде, рдкреНрд░реЗрдЯрд┐рдпрд░ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рд╣реИ:


.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 

рдХрд░реНрдХрд╢ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдкрдиреЗ рдХрдорд╛рдВрдб рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рдПрдХ рдЧрд┐рдЯ рд╣реБрдХ - рдкреНрд░реА-рдХрдорд┐рдЯ рдкрд░ рд▓рдЯрдХрд╛рдПрдВрдЧреЗред 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 ред рдореБрдЭреЗ 1 рдЪрд╛рд╣рд┐рдПред


рд╡рд╛рдкрд╕ рд╕реЗрдЯрдЕрдк рдкрд░ред рд╣рдорд╛рд░рд╛ рдкреИрдХреЗрдЬ.рдЬреЙрди рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


  "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 - рд╕рдВрдмрдВрдз рдкрд░ рдзреНрдпрд╛рди lint-staged --relative ред - --relative рдкреИрд░рд╛рдореАрдЯрд░ рдХреА --relative рд╣реИред рдЕрдм, рдЬрдм рд╣рдо рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ lint-staged ред рд╡рд╣ рдмрджрд▓реЗ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред


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


рдкреБрдирд╢реНрдЪ - рд╣рдорд╛рд░реЗ рдкреАрдПрдо рдХреЛ рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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


All Articles