ΠΡΠ½ΠΎΠ²ΠΎ Π·Π΄ΡΠ°Π²Π΅ΠΉΡΠ΅. ΠΠ° Π»ΠΈΠ½ΠΈΡ. . ΠΠ½Π΅Ρ ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ Ρ Π²Π°Ρ Π΅Π΄Π½Π° ΠΎΡ ΠΌΠΎΠΈΡΠ΅ Π³Π»Π°Π²ΠΎΠ±ΠΎΠ»ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ ΠΏΠΈΡΠ΅ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΌΠ΅Π½ΠΈΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ angular.

ΠΠ°ΠΊΡΠΎ ΡΠ΅ΡΡΠΎ ΡΡΠ°Π²Π°, Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ΅Ρ ΡΠ°ΠΌΠΎ Ρ ΠΌΠΎΡ Π΅ΠΊΠΈΠΏ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΎΡΠ΄Π°Π²Π½Π° Π±ΡΡ ΠΌΠ΅ ΡΠ΅ ΡΠΏΠΎΡΠ°Π·ΡΠΌΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅, ΠΎΡΡΡΠΎΡΠ½ΠΈΡ ΠΈ Ρ.Π½. ΠΡΠΈΠ²ΠΈΠΊΠ½Π°Ρ ΠΌΠ΅ ΠΊΡΠΌ ΡΡΡ ΠΈ ΠΆΠΈΠ²Π΅Π΅Ρ ΠΌΠ΅ Π² Ρ Π°ΡΠΌΠΎΠ½ΠΈΡ ΠΈ ΡΠ°ΡΡΠΈΠ΅. ΠΡ ΡΠ°Π΄ΠΎΡΡ Π΄ΠΎΡΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ ΡΡΠ°ΡΠΈΡ Π² Π₯Π°Π±Ρ ΠΎΡΠ½ΠΎΡΠ½ΠΎ . ΠΠ°ΡΠΎΠ²Π° ΠΎΡ Π½ΡΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠ°Π³ΠΈΡΠ½ΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ tslint Π½Π° ΠΏΡΠ΅-ΠΊΠΎΠΌΠΈΡ.
Π ΡΡΠΊ Π²Π΅ΡΠ΅ ΠΏΠΎΡΠ°ΡΠ½Π°Ρ ΠΌΠ΅. ΠΠΎΡΠ²ΠΈ ΡΠ΅ Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, Π° Ρ Π½Π΅Π³ΠΎ Π½ΠΎΠ²ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ β ΡΠ΅ΡΠΈΡΠΈΠΌΠ° Π΄ΠΎΠ±ΡΠΈ ΠΌΠ»Π°Π΄ΠΈ ΠΌΡΠΆΠ΅. Π Π½Π΅ΡΠ°ΡΠ° ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π° Π΄Π° Π½Π΅ Π²ΡΡΠ²ΡΡ ΠΏΠΎ ΠΏΠ»Π°Π½.

ΠΠΈΡΠ»Ρ, ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ Π²Π°Ρ Π·Π½Π°ΡΡ, ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π΅ Π΅ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΈΠ΅. Π ΠΌΠΎΡΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΌΠΈ Π΅ Ρ Π°ΡΠ΅ΡΠ°Π» ΠΈΡΡΠΈΠ½ΡΠΊΠΈ, Π° ΠΎΡΡΠ°Π½Π°Π»ΠΎΡΠΎβ¦ ΠΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π³ΠΎΠ²ΠΎΡΠ΅Ρ ?) ΠΡ Π΄Π°.
ΠΡΠΊΡΠΎΠ²Π΅Π½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π° ΡΠ΅ ΠΆΠ΅Π»Π°Π΅, Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ ΠΌΠ΅ΡΡΠ°Π΅Ρ ΠΌΠ΅ Π·Π° ΡΡΡ . Π Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠ΅ ΡΡΠ΄Ρ, Π·Π°ΡΠΎ Π½Π°ΡΠ°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΠΏΠΈΡΠ°Ρ, ΡΠΈΠΏ β ΠΊΠ°ΠΊΠ²ΠΎ Π·Π½Π°ΡΠΈ ΡΠΎΠ²Π°?). Π, Ρ Π½Π΅Π³ΠΎ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π½Π΅ΡΠΎ.
ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½ΡΠΌΠ°Ρ ΡΡΡΠΏΠ΅Π½ΠΈΠ΅ Π΄Π° ΡΠ·Π½Π°ΡΡ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ Π½Π°Π²Π΅Π΄Π½ΡΠΆ:
Π Π°Π·Π΄Π΅Π»ΠΈΡ ΠΌΠ΅ tslint Π½Π° ΠΌΠ΅ΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° (Π·Π° pre-commit) ΠΈ ΡΡΡΠΎΠ³ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° (Π·Π° IDE, Π·Π° Π΄Π° Π½Π°ΠΏΠΎΠΌΠ½Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π½Π΅ ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ)
ΠΠΎΠ±Π°Π²ΠΈΡ ΠΌΠ΅ Π°Π²ΡΠΎΡΠΈΠΊΡ Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎΡ ΡΡΡΠΎΠ³ΠΈΡ tslint ΠΊΡΠΌ pre-commit
ΠΠ°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° prettier
Π’Π°Π½ΡΡΠ²Π°Ρ ΠΌΠ΅ Ρ ΡΡΠΏΠ°Π½, Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ng lint Ρ lint-staged
Π‘ΡΡΠΏΠΊΠ° ΠΏΡΡΠ²Π° β ΡΠ°Π·Π΄Π΅Π»ΡΠΉ ΠΈ Π²Π»Π°Π΄Π΅ΠΉ
ΠΠΎΠ³Π°ΡΠΎ ΠΌΠΈ Ρ ΡΡΠΌΠ½Π° ΠΈΠ΄Π΅ΡΡΠ° Π΄Π° ΡΡΠ΅Π³Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° Π»ΠΈΠ½ΡΠ΅ΡΠ°, ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡ , ΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ²Π°Π»ΠΈΠΌ. ΠΠΎΠ΄ΡΡ Π΅ Π½Π°ΡΠ»Π΅Π΄Π΅Π½. ΠΡΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, Π° Π² ΡΠ°ΠΊΡΠ² ΠΎΠ±Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΡΡΠ½Π΅. ΠΠ΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π²ΡΠΎΡΠΈ Π»ΠΈΠ½ΡΠ΅Ρ Π·Π° IDE, ΠΊΠΎΠΉΡΠΎ Π΄Π° Π΄ΡΠ°Π·Π½ΠΈ ΠΎΡΠΈΡΠ΅ ΠΈ Π΄Π° ΠΏΡΠΈΠ½ΡΠΆΠ΄Π°Π²Π° Π΄Π° ΠΏΠΈΡΠ΅ΠΌ jsdoc Π·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ°, Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ ΠΈΠ»ΠΈ ΠΎΠ½Π΅Π·ΠΈ ΠΏΡΠΎΠΊΠ»Π΅ΡΠΈ onPush ΠΈ Ρ.Π½.
Π ΠΊΠΎΡΠ΅Π½Π° Π½ΠΈ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° 2 tslint ΡΠ°ΠΉΠ»Π°:
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 Ρ ide
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Π’ΡΠΊ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° ΡΡΡΠΈΠΊΡΠ½ΠΈΡ Π»ΠΈΠ½ΡΠ΅Ρ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠΈΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π° Π½Π΅ Π²ΡΡΡΠ° Π³ΡΠ΅ΡΠΊΠΈ (Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅Π»ΡΠ° Π½ΠΈ Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π°Π²ΡΠΎΠΏΠΎΠΏΡΠ°Π²ΠΊΠ°).
Π‘ΡΡΠΏΠΊΠ° ΡΡΠ΅ΡΠ° β ΠΏΠΈΡΠΈ ΠΊΡΠ°ΡΠΈΠ²ΠΎ
ΠΠΎΠ³Π°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΏΠΈΡΠ΅ ΠΏΠΎ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΡΡΠΈΠ», Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠ°Π²Π° ΡΠΌΠΎΡΠΈΡΠ΅Π»Π½ΠΎ. ΠΠΎΠ΄ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΊΠ°, ΡΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΡΠΊΠ°Ρ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡ Π΅Π΄ΠΈΠ½ ΡΠΎΠ²Π΅ΠΊ. ΠΠ° ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ prettier Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
.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 Π² ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ project. Π ΠΌΠΎΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ partner-account ΠΈ partner-account-e2e. ΠΡΠΆΠ΅Π½ ΠΌΠΈ Π΅ 1-ΡΡ.
ΠΡΡΡΠ°ΠΌ ΡΠ΅ ΠΊΡΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ°. ΠΠ°ΡΠΈΡΡ 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.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
