From 00aa425f4e19d47959f427f5d7123d9f49da46c5 Mon Sep 17 00:00:00 2001 From: Dennis Enselmann Date: Wed, 27 Mar 2019 08:44:21 +0100 Subject: [PATCH 01/11] Add angular workspace linting rules --- CHANGELOG.md | 11 +++++++++-- rules/angular.json | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 rules/angular.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aa7d74..f038970 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ -#0.0.1 +# Changelog -- Add basis linting rules +## Unreleased + +## [0.0.1] - 2019-03-27 +### Added +- Basic linting rules for open source projects + +[Unreleased]: https://github.com/webcomputing/tslint-config-webcomputing/compare/v0.0.1...HEAD +[0.0.1]: https://github.com/webcomputing/tslint-config-webcomputing/releases/tag/0.0.1 \ No newline at end of file diff --git a/rules/angular.json b/rules/angular.json new file mode 100644 index 0000000..8f7870c --- /dev/null +++ b/rules/angular.json @@ -0,0 +1,17 @@ +{ + "extends": "./tslint-base.json", + "rules": { + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "directive-selector": [true, "attribute", "app", "camelCase"], + "component-selector": [true, "element", "app", "kebab-case"] + } +} \ No newline at end of file From 9ffe178d58f4510889f178ec7da2627f6889dcd6 Mon Sep 17 00:00:00 2001 From: Dennis Enselmann Date: Wed, 27 Mar 2019 08:53:01 +0100 Subject: [PATCH 02/11] Add rules dir --- tslint-base.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tslint-base.json b/tslint-base.json index d517168..289d4e0 100644 --- a/tslint-base.json +++ b/tslint-base.json @@ -4,6 +4,7 @@ "tslint-config-airbnb", "tslint-config-prettier" ], + "rulesDirectory": "./rules", "rules": { "no-floating-promises": true, "no-unused-expression": true, From 3e08110a870b1023860825fdfea42993c4ef8721 Mon Sep 17 00:00:00 2001 From: Dennis Enselmann Date: Wed, 27 Mar 2019 09:05:58 +0100 Subject: [PATCH 03/11] Move rules from sub dir to tslint-base.json --- rules/angular.json | 3 ++- tslint-base.json | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rules/angular.json b/rules/angular.json index 8f7870c..e6ec074 100644 --- a/rules/angular.json +++ b/rules/angular.json @@ -12,6 +12,7 @@ "component-class-suffix": true, "directive-class-suffix": true, "directive-selector": [true, "attribute", "app", "camelCase"], - "component-selector": [true, "element", "app", "kebab-case"] + "component-selector": [true, "element", "app", "kebab-case"], + "no-submodule-imports": [true, "@angular/platform-browser", "@angular/core/testing"] } } \ No newline at end of file diff --git a/tslint-base.json b/tslint-base.json index 289d4e0..53c9b26 100644 --- a/tslint-base.json +++ b/tslint-base.json @@ -4,8 +4,20 @@ "tslint-config-airbnb", "tslint-config-prettier" ], - "rulesDirectory": "./rules", "rules": { + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "directive-selector": [true, "attribute", "app", "camelCase"], + "component-selector": [true, "element", "app", "kebab-case"], + "no-submodule-imports": [true, "@angular/platform-browser", "@angular/core/testing"], "no-floating-promises": true, "no-unused-expression": true, "interface-name": [true, "never-prefix"], From d47de28038f8e007311582cf2575ae85eb15b9bd Mon Sep 17 00:00:00 2001 From: Dennis Enselmann Date: Wed, 27 Mar 2019 09:06:24 +0100 Subject: [PATCH 04/11] Delete rules directory --- rules/angular.json | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 rules/angular.json diff --git a/rules/angular.json b/rules/angular.json deleted file mode 100644 index e6ec074..0000000 --- a/rules/angular.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tslint-base.json", - "rules": { - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true, - "directive-selector": [true, "attribute", "app", "camelCase"], - "component-selector": [true, "element", "app", "kebab-case"], - "no-submodule-imports": [true, "@angular/platform-browser", "@angular/core/testing"] - } -} \ No newline at end of file From cb1ec2c15f6fcbac4c622dd0707da4365492034c Mon Sep 17 00:00:00 2001 From: Dennis Enselmann Date: Wed, 27 Mar 2019 10:25:31 +0100 Subject: [PATCH 05/11] Separate angular settings from base config --- package-lock.json | 144 +++++++++++++++++++++++++++++++++++++++++--- package.json | 4 ++ tslint-angular.json | 23 +++++++ tslint-base.json | 13 ---- 4 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 tslint-angular.json diff --git a/package-lock.json b/package-lock.json index a3349fc..b275ef1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,25 @@ { - "name": "tslint-config-webcomputing", - "version": "0.0.2", + "name": "@webcomputing/tslint-config-webcomputing", + "version": "0.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular/compiler": { + "version": "7.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.11.tgz", + "integrity": "sha512-PptrtUgzuxLtBFxcmkkmhr16Pu9A3xqRQGmgTKL2mzwpt/fZswYEv4QT2E5Br8f94UP5XPv+K30kY+exjPnFjg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/core": { + "version": "7.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.11.tgz", + "integrity": "sha512-2FUgXbGn75D6HQESVVmnrjqP1l2YNwwIZISembzpr4WvTm0lxzq/9WsuPFJNWggwCerajyjYz+kDJT3RsonGZg==", + "requires": { + "tslib": "^1.9.0" + } + }, "@fimbul/bifrost": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", @@ -45,12 +61,24 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } } }, "babel-code-frame": { @@ -124,6 +152,19 @@ } } }, + "codelyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", + "requires": { + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -147,6 +188,29 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -183,6 +247,11 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -257,6 +326,11 @@ "esprima": "^4.0.0" } }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -301,6 +375,34 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", @@ -309,15 +411,36 @@ "path-parse": "^1.0.6" } }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "requires": { + "semver": "^5.3.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, "strip-ansi": { "version": "3.0.1", @@ -332,6 +455,11 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", diff --git a/package.json b/package.json index 34f7679..82a58e6 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,10 @@ "AssistantJS" ], "dependencies": { + "@angular/compiler": "^7.2.11", + "@angular/core": "^7.2.11", + "codelyzer": "~4.5.0", + "rxjs": "^6.4.0", "tslint": "^5.11.0", "tslint-config-airbnb": "^5.11.1", "tslint-config-prettier": "^1.18.0" diff --git a/tslint-angular.json b/tslint-angular.json new file mode 100644 index 0000000..a3ad61f --- /dev/null +++ b/tslint-angular.json @@ -0,0 +1,23 @@ +{ + "rulesDirectory": ["node_modules/codelyzer"], + "extends": ["./tslint-base.json"], + "rules": { + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "directive-selector": [true, "attribute", "app", "camelCase"], + "component-selector": [true, "element", "app", "kebab-case"], + "no-submodule-imports": [ + true, + "@angular/platform-browser-dynamic", + "@angular/core/testing" + ] + } +} diff --git a/tslint-base.json b/tslint-base.json index 53c9b26..d517168 100644 --- a/tslint-base.json +++ b/tslint-base.json @@ -5,19 +5,6 @@ "tslint-config-prettier" ], "rules": { - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true, - "directive-selector": [true, "attribute", "app", "camelCase"], - "component-selector": [true, "element", "app", "kebab-case"], - "no-submodule-imports": [true, "@angular/platform-browser", "@angular/core/testing"], "no-floating-promises": true, "no-unused-expression": true, "interface-name": [true, "never-prefix"], From dbe65c254fb369ba09137ed2a54858157b588408 Mon Sep 17 00:00:00 2001 From: Dennis E <34183770+denselmann@users.noreply.github.com> Date: Wed, 27 Mar 2019 11:21:21 +0100 Subject: [PATCH 06/11] Update README.md --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0037881..9a42259 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,15 @@ npm i tslint-config-webcomputing --save-dev ``` ## Usage -Add the following config in your `tslint.json` file: +Add the following config in your `tslint.json` file, to extend from our basic configuration: ``` { - "extends": "tslint-config-webcomputing" + "extends": "@webcomputing/tslint-config-webcomputing" +} +``` +For angular workspaces, we recommend to extend from `tslint-angular.json`file +``` +{ + "extends": "@webcomputing/tslint-config-webcomputing/tslint-angular" } ``` From 6b96817fa947e2a0373e4325335ba38054e8b858 Mon Sep 17 00:00:00 2001 From: Florian Bachmann <834350+baflo@users.noreply.github.com> Date: Thu, 28 Mar 2019 15:43:56 +0100 Subject: [PATCH 07/11] Allows to use dynamic function names Allows to use variables to set function names, including symbols. Useful to mock private members in mixins or to get unoverridable functions. --- tslint-base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tslint-base.json b/tslint-base.json index d517168..0fbcde0 100644 --- a/tslint-base.json +++ b/tslint-base.json @@ -19,7 +19,7 @@ true, { "static-method-regex": "^[a-z][\\w\\d]+$", - "function-regex": "^([a-z][\\w\\d]+)|(([A-Z][\\w\\d]+)Mixin)$" + "function-regex": "^([a-z][\\w\\d]+)|(\\[[a-z][\\w\\d]+\\])|(([A-Z][\\w\\d]+)Mixin)$" } ], "member-ordering": [ From f6a02140e30b903df3e6b79f3132c8660bbfd3fe Mon Sep 17 00:00:00 2001 From: Florian Bachmann <834350+baflo@users.noreply.github.com> Date: Thu, 28 Mar 2019 15:47:21 +0100 Subject: [PATCH 08/11] Adds ultra soft `strict-boolean-expressions` Mainly useful to find problems with promises. --- tslint-base.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tslint-base.json b/tslint-base.json index d517168..32ef6a5 100644 --- a/tslint-base.json +++ b/tslint-base.json @@ -7,6 +7,16 @@ "rules": { "no-floating-promises": true, "no-unused-expression": true, + "strict-boolean-expressions": [ + true, + "allow-null-union", + "allow-undefined-union", + "allow-string", + "allow-enum", + "allow-number", + "allow-mix", + "ignore-rhs" + ], "interface-name": [true, "never-prefix"], "only-arrow-functions": false, "object-shorthand-properties-first": true, From f2d3d3b6bcb2ed371b5b7b6252caa25cd1a79ac8 Mon Sep 17 00:00:00 2001 From: Dennis E <34183770+denselmann@users.noreply.github.com> Date: Thu, 28 Mar 2019 15:48:01 +0100 Subject: [PATCH 09/11] Exclude "rxjs" from no-submodule-imports --- tslint-angular.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tslint-angular.json b/tslint-angular.json index a3ad61f..d19f1ca 100644 --- a/tslint-angular.json +++ b/tslint-angular.json @@ -16,6 +16,7 @@ "component-selector": [true, "element", "app", "kebab-case"], "no-submodule-imports": [ true, + "rxjs", "@angular/platform-browser-dynamic", "@angular/core/testing" ] From 4713bd0f5679d2272b7c3c23a29601f8326482e4 Mon Sep 17 00:00:00 2001 From: Florian Bachmann <834350+baflo@users.noreply.github.com> Date: Thu, 28 Mar 2019 15:53:32 +0100 Subject: [PATCH 10/11] Adds note for vscode extensions --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 0037881..cdd8e73 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,9 @@ Add the following config in your `tslint.json` file: "extends": "tslint-config-webcomputing" } ``` + +## Visual Studio Code + +The popular VSCode linting extension (TSLint)[https://marketplace.visualstudio.com/items?itemName=eg2.tslint] isn't able to support rules that need typing, e.g. `no-floating-promises` or `use-strict-boolean` and is hence deprecated. + +Please make sure you use the new extension (TSLint)[https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin] along with (tslint-language-service)[https://github.com/angelozerr/tslint-language-service]. From 39b68cc0fd8e9687544a9b6c2d714f856f4a8d29 Mon Sep 17 00:00:00 2001 From: Dennis E <34183770+denselmann@users.noreply.github.com> Date: Wed, 10 Apr 2019 13:00:44 +0200 Subject: [PATCH 11/11] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9e5a854..5072024 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,6 @@ For angular workspaces, we recommend to extend from `tslint-angular.json`file ## Visual Studio Code -The popular VSCode linting extension (TSLint)[https://marketplace.visualstudio.com/items?itemName=eg2.tslint] isn't able to support rules that need typing, e.g. `no-floating-promises` or `use-strict-boolean` and is hence deprecated. +The popular VSCode linting extension [TSLint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint) isn't able to support rules that need typing, e.g. `no-floating-promises` or `use-strict-boolean` and is hence deprecated. -Please make sure you use the new extension (TSLint)[https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin] along with (tslint-language-service)[https://github.com/angelozerr/tslint-language-service]. +Please make sure you use the new extension [TSLint](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin) along with [tslint-language-service](https://github.com/angelozerr/tslint-language-service).