diff --git a/packages/eslint-plugin/ROADMAP.md b/packages/eslint-plugin/ROADMAP.md
index c4f99f947af4..61e4e350a5d8 100644
--- a/packages/eslint-plugin/ROADMAP.md
+++ b/packages/eslint-plugin/ROADMAP.md
@@ -18,6 +18,7 @@ It lists all TSLint rules along side rules from the ESLint ecosystem that are th
| [`adjacent-overload-signatures`] | β
| [`@typescript-eslint/adjacent-overload-signatures`] |
| [`ban-ts-ignore`] | β
| [`@typescript-eslint/ban-ts-ignore`] |
| [`ban-types`] | π | [`@typescript-eslint/ban-types`][1] |
+| [`invalid-void`] | π | N/A |
| [`member-access`] | β
| [`@typescript-eslint/explicit-member-accessibility`] |
| [`member-ordering`] | β
| [`@typescript-eslint/member-ordering`] |
| [`no-any`] | β
| [`@typescript-eslint/no-explicit-any`] |
@@ -43,67 +44,73 @@ It lists all TSLint rules along side rules from the ESLint ecosystem that are th
### Functionality
-| TSLint rule | | ESLint rule |
-| ------------------------------------ | :-: | --------------------------------------------------------------------- |
-| [`await-promise`] | β
| [`@typescript-eslint/await-thenable`] |
-| [`ban-comma-operator`] | π | [`no-sequences`][no-sequences] |
-| [`ban`] | π | [`no-restricted-properties`][no-restricted-properties] |
-| [`curly`] | π | [`curly`][curly] |
-| [`forin`] | π | [`guard-for-in`][guard-for-in] |
-| [`function-constructor`] | π | [`no-new-func`][no-new-func] |
-| [`import-blacklist`] | π | [`no-restricted-imports`][no-restricted-imports] |
-| [`label-position`] | π | [`no-unused-labels`][no-unused-labels] (similar) |
-| [`no-arg`] | π | [`no-caller`][no-caller] (also blocks `arguments.caller`) |
-| [`no-async-without-await`] | β
| [`@typescript-eslint/require-await`] |
-| [`no-bitwise`] | π | [`no-bitwise`][no-bitwise] |
-| [`no-conditional-assignment`] | π | [`no-cond-assign`][no-cond-assign][1] |
-| [`no-console`] | π | [`no-console`][no-console] (configuration works slightly differently) |
-| [`no-construct`] | π | [`no-new-wrappers`][no-new-wrappers] |
-| [`no-debugger`] | π | [`no-debugger`][no-debugger] |
-| [`no-duplicate-super`] | π | [`constructor-super`][constructor-super] |
-| [`no-duplicate-switch-case`] | π | [`no-duplicate-case`][no-duplicate-case] |
-| [`no-duplicate-variable`] | π | [`no-redeclare`][no-redeclare] |
-| [`no-dynamic-delete`] | β
| [`@typescript-eslint/no-dynamic-delete`] |
-| [`no-empty`] | π | [`no-empty`][no-empty] |
-| [`no-eval`] | π | [`no-eval`][no-eval] |
-| [`no-floating-promises`] | β
| [`@typescript-eslint/no-floating-promises`] |
-| [`no-for-in-array`] | β
| [`@typescript-eslint/no-for-in-array`] |
-| [`no-implicit-dependencies`] | π | [`import/no-extraneous-dependencies`] |
-| [`no-inferred-empty-object-type`] | π | N/A |
-| [`no-invalid-template-strings`] | π | [`no-template-curly-in-string`][no-template-curly-in-string] |
-| [`no-invalid-this`] | π | [`no-invalid-this`][no-invalid-this] |
-| [`no-misused-new`] | β
| [`@typescript-eslint/no-misused-new`] |
-| [`no-null-keyword`] | π | [`no-null/no-null`] (doesnβt handle `null` type) |
-| [`no-object-literal-type-assertion`] | β
| [`@typescript-eslint/consistent-type-assertions`] |
-| [`no-return-await`] | π | [`no-return-await`][no-return-await] |
-| [`no-shadowed-variable`] | π | [`no-shadow`][no-shadow] |
-| [`no-sparse-arrays`] | π | [`no-sparse-arrays`][no-sparse-arrays] |
-| [`no-string-literal`] | π | [`dot-notation`][dot-notation] |
-| [`no-string-throw`] | β
| [`@typescript-eslint/no-throw-literal`] |
-| [`no-submodule-imports`] | π | [`import/no-internal-modules`] (slightly different) |
-| [`no-switch-case-fall-through`] | π | [`no-fallthrough`][no-fallthrough] |
-| [`no-this-assignment`] | β
| [`@typescript-eslint/no-this-alias`] |
-| [`no-unbound-method`] | β
| [`@typescript-eslint/unbound-method`] |
-| [`no-unnecessary-class`] | β
| [`@typescript-eslint/no-extraneous-class`] |
-| [`no-unsafe-any`] | π | N/A |
-| [`no-unsafe-finally`] | π | [`no-unsafe-finally`][no-unsafe-finally] |
-| [`no-unused-expression`] | π | [`no-unused-expressions`][no-unused-expressions] |
-| [`no-unused-variable`] | π | [`@typescript-eslint/no-unused-vars`] |
-| [`no-use-before-declare`] | β
| [`@typescript-eslint/no-use-before-define`] |
-| [`no-var-keyword`] | π | [`no-var`][no-var] |
-| [`no-void-expression`] | π | [`no-void`][no-void] |
-| [`prefer-conditional-expression`] | π | N/A |
-| [`prefer-object-spread`] | π | [`prefer-object-spread`][prefer-object-spread] |
-| [`radix`] | π | [`radix`][radix] |
-| [`restrict-plus-operands`] | β
| [`@typescript-eslint/restrict-plus-operands`] |
-| [`strict-boolean-expressions`] | β
| [`@typescript-eslint/strict-boolean-expressions`] |
-| [`strict-type-predicates`] | π | N/A |
-| [`switch-default`] | π | [`default-case`][default-case] |
-| [`triple-equals`] | π | [`eqeqeq`][eqeqeq] |
-| [`typeof-compare`] | π | [`valid-typeof`][valid-typeof] |
-| [`unnecessary-constructor`] | π | [`no-useless-constructor`][no-useless-constructor] |
-| [`use-default-type-parameter`] | β
| [`@typescript-eslint/no-unnecessary-type-arguments`] |
-| [`use-isnan`] | π | [`use-isnan`][use-isnan] |
+| TSLint rule | | ESLint rule |
+| ------------------------------------ | :-: | ---------------------------------------------------------------------------------------------------- |
+| [`await-promise`] | β
| [`@typescript-eslint/await-thenable`] |
+| [`ban-comma-operator`] | π | [`no-sequences`][no-sequences] |
+| [`ban`] | π | [`no-restricted-properties`][no-restricted-properties] |
+| [`curly`] | π | [`curly`][curly] |
+| [`forin`] | π | [`guard-for-in`][guard-for-in] |
+| [`function-constructor`] | π | [`no-new-func`][no-new-func] |
+| [`import-blacklist`] | π | [`no-restricted-imports`][no-restricted-imports] |
+| [`label-position`] | π | [`no-unused-labels`][no-unused-labels] (similar) |
+| [`no-arg`] | π | [`no-caller`][no-caller] (also blocks `arguments.caller`) |
+| [`no-async-without-await`] | β
| [`@typescript-eslint/require-await`] |
+| [`no-bitwise`] | π | [`no-bitwise`][no-bitwise] |
+| [`no-conditional-assignment`] | π | [`no-cond-assign`][no-cond-assign][1] |
+| [`no-console`] | π | [`no-console`][no-console] (configuration works slightly differently) |
+| [`no-construct`] | π | [`no-new-wrappers`][no-new-wrappers] |
+| [`no-debugger`] | π | [`no-debugger`][no-debugger] |
+| [`no-duplicate-super`] | π | [`constructor-super`][constructor-super] |
+| [`no-duplicate-switch-case`] | π | [`no-duplicate-case`][no-duplicate-case] |
+| [`no-duplicate-variable`] | π | [`no-redeclare`][no-redeclare] |
+| [`no-dynamic-delete`] | β
| [`@typescript-eslint/no-dynamic-delete`] |
+| [`no-empty`] | π | [`no-empty`][no-empty] |
+| [`no-eval`] | π | [`no-eval`][no-eval] |
+| [`no-floating-promises`] | β
| [`@typescript-eslint/no-floating-promises`] |
+| [`no-for-in-array`] | β
| [`@typescript-eslint/no-for-in-array`] |
+| [`no-implicit-dependencies`] | π | [`import/no-extraneous-dependencies`] |
+| [`no-inferred-empty-object-type`] | π | N/A |
+| [`no-invalid-template-strings`] | π | [`no-template-curly-in-string`][no-template-curly-in-string] |
+| [`no-invalid-this`] | π | [`no-invalid-this`][no-invalid-this] |
+| [`no-misused-new`] | β
| [`@typescript-eslint/no-misused-new`] |
+| [`no-null-keyword`] | π | [`no-null/no-null`] (doesnβt handle `null` type) |
+| [`no-null-undefined-union`] | π | N/A |
+| [`no-object-literal-type-assertion`] | β
| [`@typescript-eslint/consistent-type-assertions`] |
+| [`no-promise-as-boolean`] | β
| [`@typescript-eslint/no-misused-promises`] |
+| [`no-restricted-globals`] | β
| [`no-restricted-globals`][no-restricted-globals] |
+| [`no-return-await`] | π | [`no-return-await`][no-return-await] |
+| [`no-shadowed-variable`] | π | [`no-shadow`][no-shadow] |
+| [`no-sparse-arrays`] | π | [`no-sparse-arrays`][no-sparse-arrays] |
+| [`no-string-literal`] | π | [`dot-notation`][dot-notation] |
+| [`no-string-throw`] | β
| [`@typescript-eslint/no-throw-literal`] |
+| [`no-submodule-imports`] | π | [`import/no-internal-modules`] (slightly different) |
+| [`no-switch-case-fall-through`] | π | [`no-fallthrough`][no-fallthrough] |
+| [`no-tautology-expression`] | π | N/A |
+| [`no-this-assignment`] | β
| [`@typescript-eslint/no-this-alias`] |
+| [`no-unbound-method`] | β
| [`@typescript-eslint/unbound-method`] |
+| [`no-unnecessary-class`] | β
| [`@typescript-eslint/no-extraneous-class`] |
+| [`no-unsafe-any`] | π | N/A |
+| [`no-unsafe-finally`] | π | [`no-unsafe-finally`][no-unsafe-finally] |
+| [`no-unused-expression`] | π | [`no-unused-expressions`][no-unused-expressions] |
+| [`no-unused-variable`] | π | [`@typescript-eslint/no-unused-vars`] |
+| [`no-use-before-declare`] | β
| [`@typescript-eslint/no-use-before-define`] |
+| [`no-var-keyword`] | π | [`no-var`][no-var] |
+| [`no-void-expression`] | π | [`no-void`][no-void] |
+| [`prefer-conditional-expression`] | π | N/A |
+| [`prefer-object-spread`] | π | [`prefer-object-spread`][prefer-object-spread] |
+| [`radix`] | π | [`radix`][radix] |
+| [`restrict-plus-operands`] | β
| [`@typescript-eslint/restrict-plus-operands`] |
+| [`static-this`] | π | N/A |
+| [`strict-boolean-expressions`] | β
| [`@typescript-eslint/strict-boolean-expressions`] |
+| [`strict-string-expressions`] | β
| [`@typescript-eslint/restrict-plus-operands`] & [`@typescript-eslint/restrict-template-expressions`] |
+| [`strict-type-predicates`] | π | N/A |
+| [`switch-default`] | π | [`default-case`][default-case] |
+| [`triple-equals`] | π | [`eqeqeq`][eqeqeq] |
+| [`typeof-compare`] | π | [`valid-typeof`][valid-typeof] |
+| [`unnecessary-constructor`] | π | [`no-useless-constructor`][no-useless-constructor] |
+| [`use-default-type-parameter`] | β
| [`@typescript-eslint/no-unnecessary-type-arguments`] |
+| [`use-isnan`] | π | [`use-isnan`][use-isnan] |
[1] The ESLint rule also supports silencing with an extra set of parentheses (`if ((foo = bar)) {}`)
@@ -164,9 +171,10 @@ It lists all TSLint rules along side rules from the ESLint ecosystem that are th
| [`no-irregular-whitespace`] | π | [`no-irregular-whitespace`][no-irregular-whitespace] with `skipStrings: false` |
| [`no-parameter-properties`] | β
| [`@typescript-eslint/no-parameter-properties`] |
| [`no-redundant-jsdoc`] | π | [`jsdoc/no-types`] |
-| [`no-reference-import`] | π | N/A |
+| [`no-reference-import`] | β
| [`@typescript-eslint/triple-slash-reference`] |
| [`no-trailing-whitespace`] | π | [`no-trailing-spaces`][no-trailing-spaces] |
| [`no-unnecessary-callback-wrapper`] | π | N/A and this might be unsafe (i.e. with `forEach`) |
+| [`no-unnecessary-else`] | π | [`no-else-return`][no-else-return] [2][2] |
+| [`variable-name`] | β
| [`@typescript-eslint/naming-convention`] |
| [`whitespace`] | π | Use [Prettier] |
[1] Recommended config: `["error", { blankLine: "always", prev: "*", next: "return" }]`
-[2] [`camelcase`][camelcase], [`no-underscore-dangle`][no-underscore-dangle], [`id-blacklist`][id-blacklist], and/or [`id-match`][id-match]
+[2] Doesn't check other control flow statements, such as `break` or `continue`.
## tslint-microsoft-contrib rules
@@ -486,6 +494,7 @@ Relevant plugins: [`chai-expect-keywords`](https://github.com/gavinaiken/eslint-
[no-magic-numbers]: https://eslint.org/docs/rules/no-magic-numbers
[no-param-reassign]: https://eslint.org/docs/rules/no-param-reassign
[no-sequences]: https://eslint.org/docs/rules/no-sequences
+[no-restricted-globals]: https://eslint.org/docs/rules/no-restricted-globals
[no-restricted-properties]: https://eslint.org/docs/rules/no-restricted-properties
[no-restricted-syntax]: https://eslint.org/docs/rules/no-restricted-syntax
[curly]: https://eslint.org/docs/rules/curly
@@ -541,6 +550,7 @@ Relevant plugins: [`chai-expect-keywords`](https://github.com/gavinaiken/eslint-
[padding-line-between-statements]: https://eslint.org/docs/rules/padding-line-between-statements
[newline-per-chained-call]: https://eslint.org/docs/rules/newline-per-chained-call
[new-parens]: https://eslint.org/docs/rules/new-parens
+[no-else-return]: https://eslint.org/docs/rules/no-else-return
[no-multiple-empty-lines]: https://eslint.org/docs/rules/no-multiple-empty-lines
[no-irregular-whitespace]: https://eslint.org/docs/rules/no-irregular-whitespace
[no-trailing-spaces]: https://eslint.org/docs/rules/no-trailing-spaces
@@ -591,6 +601,7 @@ Relevant plugins: [`chai-expect-keywords`](https://github.com/gavinaiken/eslint-
[`@typescript-eslint/no-inferrable-types`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-inferrable-types.md
[`@typescript-eslint/prefer-namespace-keyword`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/prefer-namespace-keyword.md
[`@typescript-eslint/promise-function-async`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/promise-function-async.md
+[`@typescript-eslint/no-misused-promises`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-misused-promises.md
[`@typescript-eslint/no-namespace`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-namespace.md
[`@typescript-eslint/no-non-null-assertion`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-non-null-assertion.md
[`@typescript-eslint/triple-slash-reference`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/triple-slash-reference.md
@@ -614,6 +625,7 @@ Relevant plugins: [`chai-expect-keywords`](https://github.com/gavinaiken/eslint-
[`@typescript-eslint/array-type`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/array-type.md
[`@typescript-eslint/class-name-casing`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/class-name-casing.md
[`@typescript-eslint/interface-name-prefix`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/interface-name-prefix.md
+[`@typescript-eslint/naming-convention`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/naming-convention.md
[`@typescript-eslint/no-parameter-properties`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-parameter-properties.md
[`@typescript-eslint/member-delimiter-style`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/member-delimiter-style.md
[`@typescript-eslint/prefer-for-of`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/prefer-for-of.md