แแแแแ แแ แแฎแแ แแแแแ แฏแแแ. แแแ แฉแแ แแแแขแแฅแขแแ. แแฆแแก แแ แแแแแแแแ แแแ แฉแแแก แแ แ-แแ แ แแแแแก แขแแแแแแก, แแแ แซแแ - แ แ แฃแแแ แแแแแแแแ, แ แแแแกแแช แแ แแแฅแขแก แฌแแ แก แกแฎแแแแแกแฎแแ แแแแแก แแ แแแ แแแแกแขแ แแ แแแแแ แแฃแแฎแแแแแ แแแแแแแชแแแก แแแแแแแแแก แแแแแงแแแแแแ.

แแกแ แแแฎแแ, แ แแ แแแแ แฎแแแก แแแแแแแแแแแจแ แแฎแแแแ แฉแแแก แแฃแแแแแ แแ แแแ แแแฃแจแแแแแ, แกแแแแช แแแแ แฎแแแก แฌแแ แจแแแแแแฎแแแแ แแแแแแแแก, แแแแแแขแแ แแแแก, แฉแแฆแ แแแแแแแแแก แแ แ.แจ. แฌแแกแแแแ. แจแแแแฉแแแแ แแแ แแ แแแแแแแ แแ แแชแฎแแแ แแแแแ. แฉแแแ แกแแฎแแ แฃแแแ, แกแขแแขแแแช แแ แแแแแแแฅแแแงแแ แฐแแแ แแ. แแกแ แ แแ, แ แแฆแแช แฏแแแแกแแฃแ แ แแแแแแ, tslint แแฎแแแแ แฌแแแแกแฌแแ แ แแแแแกแขแฃแ แแแแกแแแแก แแแแแแแงแแแแ.
แจแแแแแ แแ แแแแแแแ แแแ. แแแแแฉแแแ แแฎแแแ แแ แแแฅแขแ แแแแแแแแ แแแแแ แแแฆแแแฃแแ แแแแแ แแ แแแก แแฎแแแ แแแแแแแแแ แแแ, 4 แแแ แแ แแแแแแแแแ แ. แจแแแแแ แแ แ แแฆแแช แแ แแกแฌแแ แแ แฌแแ แแแแ แแ.

แแคแแฅแ แแ, แแแแ แแ แแชแแก, แ แแ แแแแแแแแ แแแแแ แแแฆแแแฃแแ แแแแแ แแฃแจแแแแ แกแแฎแแแแกแ แแ แแ แแก. แแ แแฎแแแแ แแ แแ แแ แแแฅแขแ แแแฎแกแแแก, แ แแแแแแแช แแฆแคแ แแแแแแแแฃแแ แแแงแแแ แแ แแแแแ แฉแแแ... แแแจ, แ แแแ แแกแแฃแแ แแแแ?) แแฐ, แแ.
แแฃแแฌแ แคแแแแ แ แแ แแแฅแแแ, แแ แแแฅแขแแก แแ แฅแแขแแฅแขแฃแ แ แกแแกแฃแ แแแแก แแ แฌแแ แแแแแแแแแ, แแแแแแขแแ แแแ แแ แแแ แแคแ แแ แฃแแ แแแแ แแชแแแแแ แแฅแชแ. แ แแฆแแช แแแแแแขแจแ แแแแ แแกแแแจแ แฉแแแแแ แแ, แ แแแแแ แแแแแแแแก แฌแแกแแแแแ แแแแแแจแแ แแแฃแแ แฉแแแแ แแแแฃแแแแขแแชแแ แแ แแฃแจแแแแแ, แแแแแแขแแ แแแ แแ แแฌแแ แแแแแ, แแแ แแคแ - แ แ แแ แแก แแก?). แ แแฆแแช แฃแแแ แแแแแแแแฃแแแงแ แแแแกแแแ แแแแแแจแแ แแแแ.
แแแแแแแก, แแแกแแช แแ แจแแฃแซแแแ แงแแแแ แแขแแแแก แแ แแแ แแฃแแแ แจแแกแฌแแแแ:
แฉแแแ 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-แก แฌแแกแแแ แแฅแแก 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 huskyhusky-แแก แแแฎแแแ แแแแ แฉแแแแ แแ แซแแแแแแแแก แแแจแแแแแก 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
