Как ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ имашС ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ€Π°Π·Π±ΠΎΡ€ΠΈΠΈ (настройки tslint, prettier ΠΈ Ρ‚.Π½.)

ΠžΡ‚Π½ΠΎΠ²ΠΎ Π·Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅. На линия. Π‘Π΅Ρ€Π³Π΅ΠΉ ΠžΠΌΠ΅Π»Π½ΠΈΡ†ΠΊΠΈ. ДнСс Ρ‰Π΅ сподСля с вас Π΅Π΄Π½Π° ΠΎΡ‚ ΠΌΠΎΠΈΡ‚Π΅ главоболия, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β€” ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ сС пишС ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ програмисти с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ умСния Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с angular.

Как ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ имашС ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ€Π°Π·Π±ΠΎΡ€ΠΈΠΈ (настройки tslint, prettier ΠΈ Ρ‚.Π½.)

ΠšΠ°ΠΊΡ‚ΠΎ чСсто става, дълго Π²Ρ€Π΅ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ… само с моя Π΅ΠΊΠΈΠΏ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΎΡ‚Π΄Π°Π²Π½Π° бяхмС сС споразумСли относно ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π΅, отстояния ΠΈ Ρ‚.Π½. ΠŸΡ€ΠΈΠ²ΠΈΠΊΠ½Π°Ρ…ΠΌΠ΅ към тях ΠΈ ΠΆΠΈΠ²Π΅Π΅Ρ…ΠΌΠ΅ Π² хармония ΠΈ щастиС. ΠžΡ‚ радост Π΄ΠΎΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ… статия Π² Π₯Π°Π±Ρ€ относно нашия кодстайл. Π—Π°Ρ‚ΠΎΠ²Π° ΠΎΡ‚ някакво ΠΌΠ°Π³ΠΈΡ‡Π½ΠΎ влияниС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ СдинствСно tslint Π½Π° ΠΏΡ€Π΅-ΠΊΠΎΠΌΠΈΡ‚.

И Ρ‚ΡƒΠΊ Π²Π΅Ρ‡Π΅ пораснахмС. Появи сС Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с наслСдСн ΠΊΠΎΠ΄, Π° с Π½Π΅Π³ΠΎ Π½ΠΎΠ²ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ β€” Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈΠΌΠ° Π΄ΠΎΠ±Ρ€ΠΈ ΠΌΠ»Π°Π΄ΠΈ мъТС. И Π½Π΅Ρ‰Π°Ρ‚Π° постСпСнно Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ…Π° Π΄Π° Π½Π΅ Π²ΡŠΡ€Π²ΡΡ‚ ΠΏΠΎ ΠΏΠ»Π°Π½.

Как ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ имашС ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ€Π°Π·Π±ΠΎΡ€ΠΈΠΈ (настройки tslint, prettier ΠΈ Ρ‚.Π½.)

Мисля, Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ вас знаят, Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с наслСдСн ΠΊΠΎΠ΄ Π½Π΅ Π΅ удоволствиС. Π’ моята ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° само Π΅Π΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΌΠΈ Π΅ харСсал истински, Π° останалото… Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ Π³ΠΎΠ²ΠΎΡ€Π΅Ρ…?) Ах Π΄Π°.

ΠžΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΎΡΡ‚Π°Π²ΡΡˆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π° сС ΠΆΠ΅Π»Π°Π΅, Π° ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ само ΠΌΠ΅Ρ‡Ρ‚Π°Π΅Ρ…ΠΌΠ΅ Π·Π° тях. Π’ Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ… Π΄Π° сС чудя, Π·Π°Ρ‰ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° докумСнтация ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ, ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ Π½Π΅ сС ΠΏΠΈΡˆΠ°Ρ‚, Ρ‚ΠΈΠΏ β€” ΠΊΠ°ΠΊΠ²ΠΎ Π·Π½Π°Ρ‡ΠΈ Ρ‚ΠΎΠ²Π°?). Π•, с Π½Π΅Π³ΠΎ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Ρ‰ΠΎ.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ нямат Ρ‚ΡŠΡ€ΠΏΠ΅Π½ΠΈΠ΅ Π΄Π° узнаят всички ΡΡ‚ΡŠΠΏΠΊΠΈ навСднъТ:

  • Π Π°Π·Π΄Π΅Π»ΠΈΡ…ΠΌΠ΅ 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, prettier ΠΈ Ρ‚.Π½.)

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster