Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(deps): bump @typescript-eslint/eslint-plugin from 4.28.5 to 4.30.0 #967

Conversation

dependabot[bot]
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Sep 1, 2021

Bumps @typescript-eslint/eslint-plugin from 4.28.5 to 4.30.0.

Release notes

Sourced from @​typescript-eslint/eslint-plugin's releases.

v4.30.0

4.30.0 (2021-08-30)

Bug Fixes

  • eslint-plugin: [dot-notation] false positive with optional chaining (#3711) (c19fc6e), closes #3510
  • eslint-plugin: [prefer-reduce-type-parameter] handle already existing type params (#3706) (71dd273)
  • eslint-plugin: isTypeReadonly error with <TS3.7 (#3731) (5696407)
  • visitor-keys: add key to StaticBlock (v5) (#3812) (fa35e22)

Features

  • experimental-utils: add literal types to global option (#3634) (820965c)
  • typescript-estree: add support for class static blocks (#3730) (f81831b)

v4.29.3

4.29.3 (2021-08-23)

Note: Version bump only for package @​typescript-eslint/typescript-eslint

v4.29.2

4.29.2 (2021-08-16)

Note: Version bump only for package @​typescript-eslint/typescript-eslint

v4.29.1

4.29.1 (2021-08-09)

Note: Version bump only for package @​typescript-eslint/typescript-eslint

v4.29.0

4.29.0 (2021-08-02)

Bug Fixes

  • eslint-plugin: [no-implied-eval] handle bind on nested member expressions (#3598) (f5a6806)
  • eslint-plugin: [no-implied-eval] permit more expression types (#3624) (ca7c549)
  • eslint-plugin: [no-unnecessary-boolean-literal-compare] incorrect fix when condition is reversed (#3581) (b595575)
  • eslint-plugin: [return-await] handle nested functions correctly (#3601) (4a196b5)
  • eslint-plugin: [return-await] properly handle fixes for TSAsExpression (#3631) (00a4369)
  • experimental-utils: simplify eslint-utils' findVariable's signature in ast-utils (#3574) (3ef5267)
  • typescript-estree: correct tty check (#3635) (62bcc93)
  • typescript-estree: ensure --fix works with singleRun mode (#3655) (99eca0d)

Features

... (truncated)

Changelog

Sourced from @​typescript-eslint/eslint-plugin's changelog.

4.30.0 (2021-08-30)

Bug Fixes

  • eslint-plugin: [dot-notation] false positive with optional chaining (#3711) (c19fc6e), closes #3510
  • eslint-plugin: [prefer-reduce-type-parameter] handle already existing type params (#3706) (71dd273)
  • eslint-plugin: isTypeReadonly error with <TS3.7 (#3731) (5696407)

Features

  • typescript-estree: add support for class static blocks (#3730) (f81831b)

4.29.3 (2021-08-23)

Note: Version bump only for package @​typescript-eslint/eslint-plugin

4.29.2 (2021-08-16)

Note: Version bump only for package @​typescript-eslint/eslint-plugin

4.29.1 (2021-08-09)

Note: Version bump only for package @​typescript-eslint/eslint-plugin

4.29.0 (2021-08-02)

Bug Fixes

  • eslint-plugin: [no-implied-eval] handle bind on nested member expressions (#3598) (f5a6806)
  • eslint-plugin: [no-implied-eval] permit more expression types (#3624) (ca7c549)
  • eslint-plugin: [no-unnecessary-boolean-literal-compare] incorrect fix when condition is reversed (#3581) (b595575)

... (truncated)

Commits
  • 26de645 chore: publish v4.30.0
  • 5696407 fix(eslint-plugin): isTypeReadonly error with <TS3.7 (#3731)
  • 921cbca docs(eslint-plugin): fix typo (#3725)
  • c19fc6e fix(eslint-plugin): [dot-notation] false positive with optional chaining (#3711)
  • 71dd273 fix(eslint-plugin): [prefer-reduce-type-parameter] handle already existing ty...
  • f81831b feat(typescript-estree): add support for class static blocks (#3730)
  • 055add0 chore: publish v4.29.3
  • bf402f4 chore: publish v4.29.2
  • db78642 chore: publish v4.29.1
  • 4d3ae13 chore: publish v4.29.0
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

@dependabot dependabot bot added dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code labels Sep 1, 2021
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.30.0 branch 4 times, most recently from aa0e183 to 8c9f704 Compare September 2, 2021 03:23
@ybiquitous ybiquitous self-assigned this Sep 2, 2021
@ybiquitous
Copy link
Owner

@dependabot recreate

Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.28.5 to 4.30.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.30.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@github-actions
Copy link
Contributor

github-actions bot commented Sep 2, 2021

npm diff --diff=@typescript-eslint/eslint-plugin@4.28.5 --diff=@typescript-eslint/eslint-plugin@4.30.0 --diff-unified=2
diff --git a/dist/configs/all.js b/dist/configs/all.js
index v4.28.5..v4.30.0 100644
--- a/dist/configs/all.js
+++ b/dist/configs/all.js
@@ -130,4 +130,5 @@
         '@typescript-eslint/prefer-reduce-type-parameter': 'error',
         '@typescript-eslint/prefer-regexp-exec': 'error',
+        '@typescript-eslint/prefer-return-this-type': 'error',
         '@typescript-eslint/prefer-string-starts-ends-with': 'error',
         '@typescript-eslint/prefer-ts-expect-error': 'error',
diff --git a/dist/util/astUtils.js b/dist/util/astUtils.js
index v4.28.5..v4.30.0 100644
--- a/dist/util/astUtils.js
+++ b/dist/util/astUtils.js
@@ -7,10 +7,23 @@
     o[k2] = m[k];
 }));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
 var __exportStar = (this && this.__exportStar) || function(m, exports) {
     for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.getNameLocationInGlobalDirectiveComment = void 0;
+exports.forEachReturnStatement = exports.getNameLocationInGlobalDirectiveComment = void 0;
 const escapeRegExp_1 = require("./escapeRegExp");
+const ts = __importStar(require("typescript"));
 // deeply re-export, for convenience
 __exportStar(require("@typescript-eslint/experimental-utils/dist/ast-utils"), exports);
@@ -26,5 +39,5 @@
  */
 function getNameLocationInGlobalDirectiveComment(sourceCode, comment, name) {
-    const namePattern = new RegExp(`[\\s,]${escapeRegExp_1.escapeRegExp(name)}(?:$|[\\s,:])`, 'gu');
+    const namePattern = new RegExp(`[\\s,]${(0, escapeRegExp_1.escapeRegExp)(name)}(?:$|[\\s,:])`, 'gu');
     // To ignore the first text "global".
     namePattern.lastIndex = comment.value.indexOf('global') + 6;
@@ -40,3 +53,33 @@
 }
 exports.getNameLocationInGlobalDirectiveComment = getNameLocationInGlobalDirectiveComment;
+// Copied from typescript https://github.com/microsoft/TypeScript/blob/42b0e3c4630c129ca39ce0df9fff5f0d1b4dd348/src/compiler/utilities.ts#L1335
+// Warning: This has the same semantics as the forEach family of functions,
+//          in that traversal terminates in the event that 'visitor' supplies a truthy value.
+function forEachReturnStatement(body, visitor) {
+    return traverse(body);
+    function traverse(node) {
+        switch (node.kind) {
+            case ts.SyntaxKind.ReturnStatement:
+                return visitor(node);
+            case ts.SyntaxKind.CaseBlock:
+            case ts.SyntaxKind.Block:
+            case ts.SyntaxKind.IfStatement:
+            case ts.SyntaxKind.DoStatement:
+            case ts.SyntaxKind.WhileStatement:
+            case ts.SyntaxKind.ForStatement:
+            case ts.SyntaxKind.ForInStatement:
+            case ts.SyntaxKind.ForOfStatement:
+            case ts.SyntaxKind.WithStatement:
+            case ts.SyntaxKind.SwitchStatement:
+            case ts.SyntaxKind.CaseClause:
+            case ts.SyntaxKind.DefaultClause:
+            case ts.SyntaxKind.LabeledStatement:
+            case ts.SyntaxKind.TryStatement:
+            case ts.SyntaxKind.CatchClause:
+                return ts.forEachChild(node, traverse);
+        }
+        return undefined;
+    }
+}
+exports.forEachReturnStatement = forEachReturnStatement;
 //# sourceMappingURL=astUtils.js.map
\ No newline at end of file
diff --git a/dist/rules/indent-new-do-not-use/BinarySearchTree.js b/dist/rules/indent-new-do-not-use/BinarySearchTree.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/indent-new-do-not-use/BinarySearchTree.js
+++ b/dist/rules/indent-new-do-not-use/BinarySearchTree.js
@@ -15,5 +15,5 @@
 class BinarySearchTree {
     constructor() {
-        this.rbTree = functional_red_black_tree_1.default();
+        this.rbTree = (0, functional_red_black_tree_1.default)();
     }
     /**
diff --git a/dist/rules/brace-style.js b/dist/rules/brace-style.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/brace-style.js
+++ b/dist/rules/brace-style.js
@@ -6,5 +6,5 @@
 const brace_style_1 = __importDefault(require("eslint/lib/rules/brace-style"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'brace-style',
     meta: {
@@ -31,5 +31,5 @@
         function validateCurlyPair(openingCurlyToken, closingCurlyToken) {
             if (allowSingleLine &&
-                util_1.isTokenOnSameLine(openingCurlyToken, closingCurlyToken)) {
+                (0, util_1.isTokenOnSameLine)(openingCurlyToken, closingCurlyToken)) {
                 return;
             }
@@ -38,5 +38,5 @@
             const tokenAfterOpeningCurly = sourceCode.getTokenAfter(openingCurlyToken);
             if (!isAllmanStyle &&
-                !util_1.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurlyToken)) {
+                !(0, util_1.isTokenOnSameLine)(tokenBeforeOpeningCurly, openingCurlyToken)) {
                 context.report({
                     node: openingCurlyToken,
@@ -56,5 +56,5 @@
             }
             if (isAllmanStyle &&
-                util_1.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurlyToken)) {
+                (0, util_1.isTokenOnSameLine)(tokenBeforeOpeningCurly, openingCurlyToken)) {
                 context.report({
                     node: openingCurlyToken,
@@ -63,5 +63,5 @@
                 });
             }
-            if (util_1.isTokenOnSameLine(openingCurlyToken, tokenAfterOpeningCurly) &&
+            if ((0, util_1.isTokenOnSameLine)(openingCurlyToken, tokenAfterOpeningCurly) &&
                 tokenAfterOpeningCurly !== closingCurlyToken) {
                 context.report({
@@ -71,5 +71,5 @@
                 });
             }
-            if (util_1.isTokenOnSameLine(tokenBeforeClosingCurly, closingCurlyToken) &&
+            if ((0, util_1.isTokenOnSameLine)(tokenBeforeClosingCurly, closingCurlyToken) &&
                 tokenBeforeClosingCurly !== openingCurlyToken) {
                 context.report({
diff --git a/dist/rules/comma-spacing.js b/dist/rules/comma-spacing.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/comma-spacing.js
+++ b/dist/rules/comma-spacing.js
@@ -3,5 +3,5 @@
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'comma-spacing',
     meta: {
@@ -55,5 +55,5 @@
                 if (element === null) {
                     token = sourceCode.getTokenAfter(previousToken);
-                    if (token && util_1.isCommaToken(token)) {
+                    if (token && (0, util_1.isCommaToken)(token)) {
                         ignoredTokens.add(token);
                     }
@@ -74,5 +74,5 @@
                 const param = node.params[paramLength - 1];
                 const afterToken = sourceCode.getTokenAfter(param);
-                if (afterToken && util_1.isCommaToken(afterToken)) {
+                if (afterToken && (0, util_1.isCommaToken)(afterToken)) {
                     ignoredTokens.add(afterToken);
                 }
@@ -87,5 +87,5 @@
         function validateCommaSpacing(commaToken, prevToken, nextToken) {
             if (prevToken &&
-                util_1.isTokenOnSameLine(prevToken, commaToken) &&
+                (0, util_1.isTokenOnSameLine)(prevToken, commaToken) &&
                 spaceBefore !== sourceCode.isSpaceBetweenTokens(prevToken, commaToken)) {
                 context.report({
@@ -100,5 +100,5 @@
                 });
             }
-            if (nextToken && util_1.isClosingParenToken(nextToken)) {
+            if (nextToken && (0, util_1.isClosingParenToken)(nextToken)) {
                 return;
             }
@@ -107,5 +107,5 @@
             }
             if (nextToken &&
-                util_1.isTokenOnSameLine(commaToken, nextToken) &&
+                (0, util_1.isTokenOnSameLine)(commaToken, nextToken) &&
                 spaceAfter !== sourceCode.isSpaceBetweenTokens(commaToken, nextToken)) {
                 context.report({
@@ -127,12 +127,12 @@
             'Program:exit'() {
                 tokensAndComments.forEach((token, i) => {
-                    if (!util_1.isCommaToken(token)) {
+                    if (!(0, util_1.isCommaToken)(token)) {
                         return;
                     }
                     const prevToken = tokensAndComments[i - 1];
                     const nextToken = tokensAndComments[i + 1];
-                    validateCommaSpacing(token, util_1.isCommaToken(prevToken) || ignoredTokens.has(token)
+                    validateCommaSpacing(token, (0, util_1.isCommaToken)(prevToken) || ignoredTokens.has(token)
                         ? null
-                        : prevToken, util_1.isCommaToken(nextToken) || ignoredTokens.has(token)
+                        : prevToken, (0, util_1.isCommaToken)(nextToken) || ignoredTokens.has(token)
                         ? null
                         : nextToken);
diff --git a/dist/rules/consistent-indexed-object-style.js b/dist/rules/consistent-indexed-object-style.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/consistent-indexed-object-style.js
+++ b/dist/rules/consistent-indexed-object-style.js
@@ -3,5 +3,5 @@
 const util_1 = require("../util");
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'consistent-indexed-object-style',
     meta: {
diff --git a/dist/util/createRule.js b/dist/util/createRule.js
index v4.28.5..v4.30.0 100644
--- a/dist/util/createRule.js
+++ b/dist/util/createRule.js
@@ -4,5 +4,5 @@
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 // note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder
-// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
+// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
 const version = require('../../package.json').version;
 exports.createRule = experimental_utils_1.ESLintUtils.RuleCreator(name => `https://github.com/typescript-eslint/typescript-eslint/blob/v${version}/packages/eslint-plugin/docs/rules/${name}.md`);
diff --git a/dist/rules/default-param-last.js b/dist/rules/default-param-last.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/default-param-last.js
+++ b/dist/rules/default-param-last.js
@@ -3,5 +3,5 @@
 const util_1 = require("../util");
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'default-param-last',
     meta: {
diff --git a/dist/rules/dot-notation.js b/dist/rules/dot-notation.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/dot-notation.js
+++ b/dist/rules/dot-notation.js
@@ -27,5 +27,5 @@
 const dot_notation_1 = __importDefault(require("eslint/lib/rules/dot-notation"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'dot-notation',
     meta: {
@@ -81,5 +81,5 @@
         var _a;
         const rules = dot_notation_1.default.create(context);
-        const { program, esTreeNodeToTSNodeMap } = util_1.getParserServices(context);
+        const { program, esTreeNodeToTSNodeMap } = (0, util_1.getParserServices)(context);
         const typeChecker = program.getTypeChecker();
         const allowPrivateClassPropertyAccess = options.allowPrivateClassPropertyAccess;
@@ -108,5 +108,7 @@
                         allowIndexSignaturePropertyAccess) {
                         const objectType = typeChecker.getTypeAtLocation(esTreeNodeToTSNodeMap.get(node.object));
-                        const indexType = typeChecker.getIndexTypeOfType(objectType, ts.IndexKind.String);
+                        const indexType = objectType
+                            .getNonNullableType()
+                            .getStringIndexType();
                         if (indexType != undefined) {
                             return;
diff --git a/dist/rules/explicit-function-return-type.js b/dist/rules/explicit-function-return-type.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/explicit-function-return-type.js
+++ b/dist/rules/explicit-function-return-type.js
@@ -79,5 +79,5 @@
                     return;
                 }
-                explicitReturnTypeUtils_1.checkFunctionExpressionReturnType(node, options, sourceCode, loc => context.report({
+                (0, explicitReturnTypeUtils_1.checkFunctionExpressionReturnType)(node, options, sourceCode, loc => context.report({
                     node,
                     loc,
@@ -86,5 +86,5 @@
             },
             FunctionDeclaration(node) {
-                explicitReturnTypeUtils_1.checkFunctionReturnType(node, options, sourceCode, loc => context.report({
+                (0, explicitReturnTypeUtils_1.checkFunctionReturnType)(node, options, sourceCode, loc => context.report({
                     node,
                     loc,
diff --git a/dist/rules/explicit-module-boundary-types.js b/dist/rules/explicit-module-boundary-types.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/explicit-module-boundary-types.js
+++ b/dist/rules/explicit-module-boundary-types.js
@@ -231,5 +231,5 @@
                 }
                 if (!util.isFunction(current) ||
-                    !explicitReturnTypeUtils_1.doesImmediatelyReturnFunctionExpression(current)) {
+                    !(0, explicitReturnTypeUtils_1.doesImmediatelyReturnFunctionExpression)(current)) {
                     return false;
                 }
@@ -384,9 +384,9 @@
             checkedFunctions.add(node);
             if (isAllowedName(node.parent) ||
-                explicitReturnTypeUtils_1.isTypedFunctionExpression(node, options) ||
+                (0, explicitReturnTypeUtils_1.isTypedFunctionExpression)(node, options) ||
                 ancestorHasReturnType(node)) {
                 return;
             }
-            explicitReturnTypeUtils_1.checkFunctionExpressionReturnType(node, options, sourceCode, loc => {
+            (0, explicitReturnTypeUtils_1.checkFunctionExpressionReturnType)(node, options, sourceCode, loc => {
                 context.report({
                     node,
@@ -405,5 +405,5 @@
                 return;
             }
-            explicitReturnTypeUtils_1.checkFunctionReturnType(node, options, sourceCode, loc => {
+            (0, explicitReturnTypeUtils_1.checkFunctionReturnType)(node, options, sourceCode, loc => {
                 context.report({
                     node,
diff --git a/dist/util/explicitReturnTypeUtils.js b/dist/util/explicitReturnTypeUtils.js
index v4.28.5..v4.30.0 100644
--- a/dist/util/explicitReturnTypeUtils.js
+++ b/dist/util/explicitReturnTypeUtils.js
@@ -56,5 +56,5 @@
         return false;
     }
-    return (astUtils_1.isTypeAssertion(parent) ||
+    return ((0, astUtils_1.isTypeAssertion)(parent) ||
         isClassPropertyWithTypeAnnotation(parent) ||
         isVariableDeclaratorWithTypeAnnotation(parent) ||
@@ -112,5 +112,5 @@
 function returnsConstAssertionDirectly(node) {
     const { body } = node;
-    if (astUtils_1.isTypeAssertion(body)) {
+    if ((0, astUtils_1.isTypeAssertion)(body)) {
         const { typeAnnotation } = body;
         if (typeAnnotation.type === experimental_utils_1.AST_NODE_TYPES.TSTypeReference) {
@@ -128,9 +128,9 @@
  */
 function isTypedFunctionExpression(node, options) {
-    const parent = nullThrows_1.nullThrows(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
+    const parent = (0, nullThrows_1.nullThrows)(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
     if (!options.allowTypedFunctionExpressions) {
         return false;
     }
-    return (astUtils_1.isTypeAssertion(parent) ||
+    return ((0, astUtils_1.isTypeAssertion)(parent) ||
         isVariableDeclaratorWithTypeAnnotation(parent) ||
         isClassPropertyWithTypeAnnotation(parent) ||
@@ -148,5 +148,5 @@
         return true;
     }
-    const parent = nullThrows_1.nullThrows(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
+    const parent = (0, nullThrows_1.nullThrows)(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
     if (options.allowExpressions &&
         parent.type !== experimental_utils_1.AST_NODE_TYPES.VariableDeclarator &&
@@ -172,5 +172,5 @@
         return true;
     }
-    if (node.returnType || astUtils_1.isConstructor(node.parent) || astUtils_1.isSetter(node.parent)) {
+    if (node.returnType || (0, astUtils_1.isConstructor)(node.parent) || (0, astUtils_1.isSetter)(node.parent)) {
         return true;
     }
@@ -184,5 +184,5 @@
         return;
     }
-    report(getFunctionHeadLoc_1.getFunctionHeadLoc(node, sourceCode));
+    report((0, getFunctionHeadLoc_1.getFunctionHeadLoc)(node, sourceCode));
 }
 exports.checkFunctionReturnType = checkFunctionReturnType;
diff --git a/dist/rules/indent-new-do-not-use/index.js b/dist/rules/indent-new-do-not-use/index.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/indent-new-do-not-use/index.js
+++ b/dist/rules/indent-new-do-not-use/index.js
@@ -185,5 +185,5 @@
     ],
 };
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'indent',
     meta: {
@@ -481,5 +481,5 @@
             function getFirstToken(element) {
                 let token = sourceCode.getTokenBefore(element);
-                while (util_1.isOpeningParenToken(token) && token !== startToken) {
+                while ((0, util_1.isOpeningParenToken)(token) && token !== startToken) {
                     token = sourceCode.getTokenBefore(token);
                 }
@@ -534,6 +534,6 @@
                 let firstBodyToken = sourceCode.getFirstToken(node);
                 let lastBodyToken = sourceCode.getLastToken(node);
-                while (util_1.isOpeningParenToken(sourceCode.getTokenBefore(firstBodyToken)) &&
-                    util_1.isClosingParenToken(sourceCode.getTokenAfter(lastBodyToken))) {
+                while ((0, util_1.isOpeningParenToken)(sourceCode.getTokenBefore(firstBodyToken)) &&
+                    (0, util_1.isClosingParenToken)(sourceCode.getTokenAfter(lastBodyToken))) {
                     firstBodyToken = sourceCode.getTokenBefore(firstBodyToken);
                     lastBodyToken = sourceCode.getTokenAfter(lastBodyToken);
@@ -549,5 +549,5 @@
                 if (lastToken &&
                     node.type !== experimental_utils_1.AST_NODE_TYPES.EmptyStatement &&
-                    util_1.isSemicolonToken(lastToken)) {
+                    (0, util_1.isSemicolonToken)(lastToken)) {
                     offsets.setDesiredOffset(lastToken, lastParentToken, 0);
                 }
@@ -576,8 +576,8 @@
             tokens.forEach(nextToken => {
                 // Accumulate a list of parenthesis pairs
-                if (util_1.isOpeningParenToken(nextToken)) {
+                if ((0, util_1.isOpeningParenToken)(nextToken)) {
                     parenStack.push(nextToken);
                 }
-                else if (util_1.isClosingParenToken(nextToken)) {
+                else if ((0, util_1.isClosingParenToken)(nextToken)) {
                     parenPairs.unshift({ left: parenStack.pop(), right: nextToken });
                 }
@@ -662,5 +662,5 @@
             ArrowFunctionExpression(node) {
                 const firstToken = sourceCode.getFirstToken(node);
-                if (util_1.isOpeningParenToken(firstToken)) {
+                if ((0, util_1.isOpeningParenToken)(firstToken)) {
                     const openingParen = firstToken;
                     const closingParen = sourceCode.getTokenBefore(node.body, util_1.isClosingParenToken);
@@ -875,6 +875,6 @@
                 // Only indent the arguments if the NewExpression has parens (e.g. `new Foo(bar)` or `new Foo()`, but not `new Foo`
                 if (node.arguments.length > 0 ||
-                    (util_1.isClosingParenToken(sourceCode.getLastToken(node)) &&
-                        util_1.isOpeningParenToken(sourceCode.getLastToken(node, 1)))) {
+                    ((0, util_1.isClosingParenToken)(sourceCode.getLastToken(node)) &&
+                        (0, util_1.isOpeningParenToken)(sourceCode.getLastToken(node, 1)))) {
                     addFunctionCallIndent(node);
                 }
@@ -967,5 +967,5 @@
                     offsets.setDesiredOffsets(node.range, firstToken, variableIndent);
                 }
-                if (util_1.isSemicolonToken(lastToken)) {
+                if ((0, util_1.isSemicolonToken)(lastToken)) {
                     offsets.ignoreToken(lastToken);
                 }
@@ -1117,5 +1117,5 @@
                         return;
                     }
-                    if (util_1.isCommentToken(firstTokenOfLine)) {
+                    if ((0, util_1.isCommentToken)(firstTokenOfLine)) {
                         const tokenBefore = precedingTokens.get(firstTokenOfLine);
                         const tokenAfter = tokenBefore
diff --git a/dist/rules/index.js b/dist/rules/index.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/index.js
+++ b/dist/rules/index.js
@@ -100,4 +100,5 @@
 const prefer_reduce_type_parameter_1 = __importDefault(require("./prefer-reduce-type-parameter"));
 const prefer_regexp_exec_1 = __importDefault(require("./prefer-regexp-exec"));
+const prefer_return_this_type_1 = __importDefault(require("./prefer-return-this-type"));
 const prefer_string_starts_ends_with_1 = __importDefault(require("./prefer-string-starts-ends-with"));
 const prefer_ts_expect_error_1 = __importDefault(require("./prefer-ts-expect-error"));
@@ -217,4 +218,5 @@
     'prefer-reduce-type-parameter': prefer_reduce_type_parameter_1.default,
     'prefer-regexp-exec': prefer_regexp_exec_1.default,
+    'prefer-return-this-type': prefer_return_this_type_1.default,
     'prefer-string-starts-ends-with': prefer_string_starts_ends_with_1.default,
     'prefer-ts-expect-error': prefer_ts_expect_error_1.default,
diff --git a/dist/rules/init-declarations.js b/dist/rules/init-declarations.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/init-declarations.js
+++ b/dist/rules/init-declarations.js
@@ -8,5 +8,5 @@
 const init_declarations_1 = __importDefault(require("eslint/lib/rules/init-declarations"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'init-declarations',
     meta: {
diff --git a/dist/util/isTypeReadonly.js b/dist/util/isTypeReadonly.js
index v4.28.5..v4.30.0 100644
--- a/dist/util/isTypeReadonly.js
+++ b/dist/util/isTypeReadonly.js
@@ -26,5 +26,10 @@
 function isTypeReadonlyArrayOrTuple(checker, type, seenTypes) {
     function checkTypeArguments(arrayType) {
-        const typeArguments = checker.getTypeArguments(arrayType);
+        var _a;
+        const typeArguments = 
+        // getTypeArguments was only added in TS3.7
+        checker.getTypeArguments
+            ? checker.getTypeArguments(arrayType)
+            : (_a = arrayType.typeArguments) !== null && _a !== void 0 ? _a : [];
         // this shouldn't happen in reality as:
         // - tuples require at least 1 type argument
@@ -41,5 +46,5 @@
     }
     if (checker.isArrayType(type)) {
-        const symbol = _1.nullThrows(type.getSymbol(), _1.NullThrowsReasons.MissingToken('symbol', 'array type'));
+        const symbol = (0, _1.nullThrows)(type.getSymbol(), _1.NullThrowsReasons.MissingToken('symbol', 'array type'));
         const escapedName = symbol.getEscapedName();
         if (escapedName === 'Array') {
@@ -70,5 +75,5 @@
         // ensure the properties are marked as readonly
         for (const property of properties) {
-            if (!tsutils_1.isPropertyReadonlyInType(type, property.getEscapedName(), checker)) {
+            if (!(0, tsutils_1.isPropertyReadonlyInType)(type, property.getEscapedName(), checker)) {
                 return 2 /* Mutable */;
             }
@@ -80,5 +85,5 @@
         // doing this deep, potentially expensive check.
         for (const property of properties) {
-            const propertyType = _1.nullThrows(_1.getTypeOfPropertyOfType(checker, type, property), _1.NullThrowsReasons.MissingToken(`property "${property.name}"`, 'type'));
+            const propertyType = (0, _1.nullThrows)((0, _1.getTypeOfPropertyOfType)(checker, type, property), _1.NullThrowsReasons.MissingToken(`property "${property.name}"`, 'type'));
             // handle recursive types.
             // we only need this simple check, because a mutable recursive type will break via the above prop readonly check
@@ -105,7 +110,7 @@
 function isTypeReadonlyRecurser(checker, type, seenTypes) {
     seenTypes.add(type);
-    if (tsutils_1.isUnionType(type)) {
+    if ((0, tsutils_1.isUnionType)(type)) {
         // all types in the union must be readonly
-        const result = tsutils_1.unionTypeParts(type).every(t => isTypeReadonlyRecurser(checker, t, seenTypes));
+        const result = (0, tsutils_1.unionTypeParts)(type).every(t => isTypeReadonlyRecurser(checker, t, seenTypes));
         const readonlyness = result ? 3 /* Readonly */ : 2 /* Mutable */;
         return readonlyness;
@@ -113,5 +118,5 @@
     // all non-object, non-intersection types are readonly.
     // this should only be primitive types
-    if (!tsutils_1.isObjectType(type) && !tsutils_1.isUnionOrIntersectionType(type)) {
+    if (!(0, tsutils_1.isObjectType)(type) && !(0, tsutils_1.isUnionOrIntersectionType)(type)) {
         return 3 /* Readonly */;
     }
diff --git a/dist/rules/naming-convention.js b/dist/rules/naming-convention.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/naming-convention.js
+++ b/dist/rules/naming-convention.js
@@ -74,5 +74,5 @@
                     options: defaultCamelCaseAllTheThingsConfig,
                 }, contextWithoutDefaults);
-        const validators = naming_convention_utils_1.parseOptions(context);
+        const validators = (0, naming_convention_utils_1.parseOptions)(context);
         // getParserServices(context, false) -- dirty hack to work around the docs checker test...
         const compilerOptions = util
diff --git a/dist/rules/no-implied-eval.js b/dist/rules/no-implied-eval.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-implied-eval.js
+++ b/dist/rules/no-implied-eval.js
@@ -92,4 +92,9 @@
             return signatures.length > 0;
         }
+        function isBind(node) {
+            return node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression
+                ? isBind(node.property)
+                : node.type === experimental_utils_1.AST_NODE_TYPES.Identifier && node.name === 'bind';
+        }
         function isFunction(node) {
             switch (node.type) {
@@ -98,14 +103,11 @@
                 case experimental_utils_1.AST_NODE_TYPES.FunctionExpression:
                     return true;
-                case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
-                case experimental_utils_1.AST_NODE_TYPES.Identifier:
-                case experimental_utils_1.AST_NODE_TYPES.ConditionalExpression:
-                    return isFunctionType(node);
+                case experimental_utils_1.AST_NODE_TYPES.Literal:
+                case experimental_utils_1.AST_NODE_TYPES.TemplateLiteral:
+                    return false;
                 case experimental_utils_1.AST_NODE_TYPES.CallExpression:
-                    return ((node.callee.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
-                        node.callee.name === 'bind') ||
-                        isFunctionType(node));
+                    return isBind(node.callee) || isFunctionType(node);
                 default:
-                    return false;
+                    return isFunctionType(node);
             }
         }
diff --git a/dist/rules/no-invalid-this.js b/dist/rules/no-invalid-this.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-invalid-this.js
+++ b/dist/rules/no-invalid-this.js
@@ -8,5 +8,5 @@
 const no_invalid_this_1 = __importDefault(require("eslint/lib/rules/no-invalid-this"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'no-invalid-this',
     meta: {
diff --git a/dist/rules/no-redeclare.js b/dist/rules/no-redeclare.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-redeclare.js
+++ b/dist/rules/no-redeclare.js
@@ -69,4 +69,8 @@
             experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration,
         ]);
+        const ENUM_DECLARATION_MERGE_NODES = new Set([
+            experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration,
+            experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration,
+        ]);
         function* iterateDeclarations(variable) {
             if ((options === null || options === void 0 ? void 0 : options.builtinGlobals) &&
@@ -126,5 +130,5 @@
                         return;
                     }
-                    // there's more than one class declaration, which needs to be reported
+                    // there's more than one function declaration, which needs to be reported
                     for (const { identifier } of functionDecls) {
                         yield { type: 'syntax', node: identifier, loc: identifier.loc };
@@ -132,4 +136,18 @@
                     return;
                 }
+                if (
+                // enum + namespace merging
+                identifiers.every(({ parent }) => ENUM_DECLARATION_MERGE_NODES.has(parent.type))) {
+                    const enumDecls = identifiers.filter(({ parent }) => parent.type === experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration);
+                    if (enumDecls.length === 1) {
+                        // safe declaration merging
+                        return;
+                    }
+                    // there's more than one enum declaration, which needs to be reported
+                    for (const { identifier } of enumDecls) {
+                        yield { type: 'syntax', node: identifier, loc: identifier.loc };
+                    }
+                    return;
+                }
             }
             for (const { identifier } of identifiers) {
diff --git a/dist/rules/no-unnecessary-boolean-literal-compare.js b/dist/rules/no-unnecessary-boolean-literal-compare.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unnecessary-boolean-literal-compare.js
+++ b/dist/rules/no-unnecessary-boolean-literal-compare.js
@@ -131,5 +131,5 @@
                     range: expression.range[0] < against.range[0]
                         ? [expression.range[1], against.range[1]]
-                        : [against.range[1], expression.range[1]],
+                        : [against.range[0], expression.range[0]],
                 };
             }
diff --git a/dist/rules/no-unnecessary-condition.js b/dist/rules/no-unnecessary-condition.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unnecessary-condition.js
+++ b/dist/rules/no-unnecessary-condition.js
@@ -26,24 +26,24 @@
 // Truthiness utilities
 // #region
-const isTruthyLiteral = (type) => tsutils_1.isBooleanLiteralType(type, true) || (tsutils_1.isLiteralType(type) && !!type.value);
-const isPossiblyFalsy = (type) => tsutils_1.unionTypeParts(type)
+const isTruthyLiteral = (type) => (0, tsutils_1.isBooleanLiteralType)(type, true) || ((0, tsutils_1.isLiteralType)(type) && !!type.value);
+const isPossiblyFalsy = (type) => (0, tsutils_1.unionTypeParts)(type)
     // PossiblyFalsy flag includes literal values, so exclude ones that
     // are definitely truthy
     .filter(t => !isTruthyLiteral(t))
-    .some(type => util_1.isTypeFlagSet(type, ts.TypeFlags.PossiblyFalsy));
-const isPossiblyTruthy = (type) => tsutils_1.unionTypeParts(type).some(type => !tsutils_1.isFalsyType(type));
+    .some(type => (0, util_1.isTypeFlagSet)(type, ts.TypeFlags.PossiblyFalsy));
+const isPossiblyTruthy = (type) => (0, tsutils_1.unionTypeParts)(type).some(type => !(0, tsutils_1.isFalsyType)(type));
 // Nullish utilities
 const nullishFlag = ts.TypeFlags.Undefined | ts.TypeFlags.Null;
-const isNullishType = (type) => util_1.isTypeFlagSet(type, nullishFlag);
-const isPossiblyNullish = (type) => tsutils_1.unionTypeParts(type).some(isNullishType);
-const isAlwaysNullish = (type) => tsutils_1.unionTypeParts(type).every(isNullishType);
+const isNullishType = (type) => (0, util_1.isTypeFlagSet)(type, nullishFlag);
+const isPossiblyNullish = (type) => (0, tsutils_1.unionTypeParts)(type).some(isNullishType);
+const isAlwaysNullish = (type) => (0, tsutils_1.unionTypeParts)(type).every(isNullishType);
 // isLiteralType only covers numbers and strings, this is a more exhaustive check.
-const isLiteral = (type) => tsutils_1.isBooleanLiteralType(type, true) ||
-    tsutils_1.isBooleanLiteralType(type, false) ||
+const isLiteral = (type) => (0, tsutils_1.isBooleanLiteralType)(type, true) ||
+    (0, tsutils_1.isBooleanLiteralType)(type, false) ||
     type.flags === ts.TypeFlags.Undefined ||
     type.flags === ts.TypeFlags.Null ||
     type.flags === ts.TypeFlags.Void ||
-    tsutils_1.isLiteralType(type);
-exports.default = util_1.createRule({
+    (0, tsutils_1.isLiteralType)(type);
+exports.default = (0, util_1.createRule)({
     name: 'no-unnecessary-condition',
     meta: {
@@ -91,9 +91,9 @@
     ],
     create(context, [{ allowConstantLoopConditions, allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing, },]) {
-        const service = util_1.getParserServices(context);
+        const service = (0, util_1.getParserServices)(context);
         const checker = service.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
         const compilerOptions = service.program.getCompilerOptions();
-        const isStrictNullChecks = tsutils_1.isStrictCompilerOptionEnabled(compilerOptions, 'strictNullChecks');
+        const isStrictNullChecks = (0, tsutils_1.isStrictCompilerOptionEnabled)(compilerOptions, 'strictNullChecks');
         if (!isStrictNullChecks &&
             allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing !== true) {
@@ -108,5 +108,5 @@
         function getNodeType(node) {
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
-            return util_1.getConstrainedTypeAtLocation(checker, tsNode);
+            return (0, util_1.getConstrainedTypeAtLocation)(checker, tsNode);
         }
         function nodeIsArrayType(node) {
@@ -159,11 +159,11 @@
             // Conditional is always necessary if it involves:
             //    `any` or `unknown` or a naked type parameter
-            if (tsutils_1.unionTypeParts(type).some(part => util_1.isTypeAnyType(part) ||
-                util_1.isTypeUnknownType(part) ||
-                util_1.isTypeFlagSet(part, ts.TypeFlags.TypeParameter))) {
+            if ((0, tsutils_1.unionTypeParts)(type).some(part => (0, util_1.isTypeAnyType)(part) ||
+                (0, util_1.isTypeUnknownType)(part) ||
+                (0, util_1.isTypeFlagSet)(part, ts.TypeFlags.TypeParameter))) {
                 return;
             }
             let messageId = null;
-            if (util_1.isTypeFlagSet(type, ts.TypeFlags.Never)) {
+            if ((0, util_1.isTypeFlagSet)(type, ts.TypeFlags.Never)) {
                 messageId = 'never';
             }
@@ -187,9 +187,9 @@
             const type = getNodeType(node);
             // Conditional is always necessary if it involves `any` or `unknown`
-            if (util_1.isTypeAnyType(type) || util_1.isTypeUnknownType(type)) {
+            if ((0, util_1.isTypeAnyType)(type) || (0, util_1.isTypeUnknownType)(type)) {
                 return;
             }
             let messageId = null;
-            if (util_1.isTypeFlagSet(type, ts.TypeFlags.Never)) {
+            if ((0, util_1.isTypeFlagSet)(type, ts.TypeFlags.Never)) {
                 messageId = 'never';
             }
@@ -248,5 +248,5 @@
                         flag |= NULL | UNDEFINED;
                     }
-                    return util_1.isTypeFlagSet(type, flag);
+                    return (0, util_1.isTypeFlagSet)(type, flag);
                 };
                 if ((leftType.flags === UNDEFINED &&
@@ -288,5 +288,5 @@
              */
             if (allowConstantLoopConditions &&
-                tsutils_1.isBooleanLiteralType(getNodeType(node.test), true)) {
+                (0, tsutils_1.isBooleanLiteralType)(getNodeType(node.test), true)) {
                 return;
             }
@@ -334,5 +334,5 @@
                 }
                 // Otherwise just do type analysis on the function as a whole.
-                const returnTypes = tsutils_1.getCallSignaturesOfType(getNodeType(callback)).map(sig => sig.getReturnType());
+                const returnTypes = (0, tsutils_1.getCallSignaturesOfType)(getNodeType(callback)).map(sig => sig.getReturnType());
                 /* istanbul ignore if */ if (returnTypes.length === 0) {
                     // Not a callable function
@@ -340,5 +340,5 @@
                 }
                 // Predicate is always necessary if it involves `any` or `unknown`
-                if (returnTypes.some(t => util_1.isTypeAnyType(t) || util_1.isTypeUnknownType(t))) {
+                if (returnTypes.some(t => (0, util_1.isTypeAnyType)(t) || (0, util_1.isTypeUnknownType)(t))) {
                     return;
                 }
@@ -381,10 +381,10 @@
             }
             if (propertyType.isNumberLiteral() || propertyType.isStringLiteral()) {
-                const propType = util_1.getTypeOfPropertyOfName(checker, objType, propertyType.value.toString());
+                const propType = (0, util_1.getTypeOfPropertyOfName)(checker, objType, propertyType.value.toString());
                 if (propType) {
-                    return util_1.isNullableType(propType, { allowUndefined: true });
+                    return (0, util_1.isNullableType)(propType, { allowUndefined: true });
                 }
             }
-            const typeName = util_1.getTypeName(checker, propertyType);
+            const typeName = (0, util_1.getTypeName)(checker, propertyType);
             return !!((typeName === 'string' &&
                 checker.getIndexInfoOfType(objType, ts.IndexKind.String)) ||
@@ -403,5 +403,5 @@
             const prevType = getNodeType(node.object);
             const property = node.property;
-            if (prevType.isUnion() && util_1.isIdentifier(property)) {
+            if (prevType.isUnion() && (0, util_1.isIdentifier)(property)) {
                 const isOwnNullable = prevType.types.some(type => {
                     if (node.computed) {
@@ -409,8 +409,8 @@
                         return isNullablePropertyType(type, propertyType);
                     }
-                    const propType = util_1.getTypeOfPropertyOfName(checker, type, property.name);
-                    return propType && util_1.isNullableType(propType, { allowUndefined: true });
+                    const propType = (0, util_1.getTypeOfPropertyOfName)(checker, type, property.name);
+                    return propType && (0, util_1.isNullableType)(propType, { allowUndefined: true });
                 });
-                return (!isOwnNullable && util_1.isNullableType(prevType, { allowUndefined: true }));
+                return (!isOwnNullable && (0, util_1.isNullableType)(prevType, { allowUndefined: true }));
             }
             return false;
@@ -421,7 +421,7 @@
                 ? !isNullableOriginFromPrev(node)
                 : true;
-            return (util_1.isTypeAnyType(type) ||
-                util_1.isTypeUnknownType(type) ||
-                (util_1.isNullableType(type, { allowUndefined: true }) && isOwnNullable));
+            return ((0, util_1.isTypeAnyType)(type) ||
+                (0, util_1.isTypeUnknownType)(type) ||
+                ((0, util_1.isNullableType)(type, { allowUndefined: true }) && isOwnNullable));
         }
         function checkOptionalChain(node, beforeOperator, fix) {
@@ -441,5 +441,5 @@
                 return;
             }
-            const questionDotOperator = util_1.nullThrows(sourceCode.getTokenAfter(beforeOperator, token => token.type === experimental_utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '?.'), util_1.NullThrowsReasons.MissingToken('operator', node.type));
+            const questionDotOperator = (0, util_1.nullThrows)(sourceCode.getTokenAfter(beforeOperator, token => token.type === experimental_utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '?.'), util_1.NullThrowsReasons.MissingToken('operator', node.type));
             context.report({
                 node,
diff --git a/dist/rules/no-unnecessary-type-arguments.js b/dist/rules/no-unnecessary-type-arguments.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unnecessary-type-arguments.js
+++ b/dist/rules/no-unnecessary-type-arguments.js
@@ -96,5 +96,5 @@
         return undefined;
     }
-    return util_1.findFirstResult(declarations, decl => ts.isClassLike(decl) ||
+    return (0, util_1.findFirstResult)(declarations, decl => ts.isClassLike(decl) ||
         ts.isTypeAliasDeclaration(decl) ||
         ts.isInterfaceDeclaration(decl)
diff --git a/dist/rules/no-unnecessary-type-assertion.js b/dist/rules/no-unnecessary-type-assertion.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unnecessary-type-assertion.js
+++ b/dist/rules/no-unnecessary-type-assertion.js
@@ -97,8 +97,8 @@
             if (
             // non-strict mode doesn't care about used before assigned errors
-            tsutils_1.isStrictCompilerOptionEnabled(compilerOptions, 'strictNullChecks') &&
+            (0, tsutils_1.isStrictCompilerOptionEnabled)(compilerOptions, 'strictNullChecks') &&
                 // ignore class properties as they are compile time guarded
                 // also ignore function arguments as they can't be used before defined
-                tsutils_1.isVariableDeclaration(declaration) &&
+                (0, tsutils_1.isVariableDeclaration)(declaration) &&
                 // is it `const x!: number`
                 declaration.initializer === undefined &&
@@ -206,7 +206,7 @@
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
                 const castType = checker.getTypeAtLocation(originalNode);
-                if (tsutils_1.isTypeFlagSet(castType, ts.TypeFlags.Literal) ||
-                    (tsutils_1.isObjectType(castType) &&
-                        (tsutils_1.isObjectFlagSet(castType, ts.ObjectFlags.Tuple) ||
+                if ((0, tsutils_1.isTypeFlagSet)(castType, ts.TypeFlags.Literal) ||
+                    ((0, tsutils_1.isObjectType)(castType) &&
+                        ((0, tsutils_1.isObjectFlagSet)(castType, ts.ObjectFlags.Tuple) ||
                             couldBeTupleType(castType)))) {
                     // It's not always safe to remove a cast to a literal type or tuple
diff --git a/dist/rules/no-unsafe-assignment.js b/dist/rules/no-unsafe-assignment.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unsafe-assignment.js
+++ b/dist/rules/no-unsafe-assignment.js
@@ -190,5 +190,5 @@
                 if (!isNoImplicitThis) {
                     // `var foo = this`
-                    const thisExpression = util_1.getThisExpression(senderNode);
+                    const thisExpression = (0, util_1.getThisExpression)(senderNode);
                     if (thisExpression &&
                         util.isTypeAnyType(util.getConstrainedTypeAtLocation(checker, esTreeNodeToTSNodeMap.get(thisExpression)))) {
diff --git a/dist/rules/no-unsafe-call.js b/dist/rules/no-unsafe-call.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unsafe-call.js
+++ b/dist/rules/no-unsafe-call.js
@@ -56,5 +56,5 @@
                 if (!isNoImplicitThis) {
                     // `this()` or `this.foo()` or `this.foo[bar]()`
-                    const thisExpression = util_1.getThisExpression(node);
+                    const thisExpression = (0, util_1.getThisExpression)(node);
                     if (thisExpression &&
                         util.isTypeAnyType(util.getConstrainedTypeAtLocation(checker, esTreeNodeToTSNodeMap.get(thisExpression)))) {
diff --git a/dist/rules/no-unsafe-member-access.js b/dist/rules/no-unsafe-member-access.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unsafe-member-access.js
+++ b/dist/rules/no-unsafe-member-access.js
@@ -75,5 +75,5 @@
                 if (!isNoImplicitThis) {
                     // `this.foo` or `this.foo[bar]`
-                    const thisExpression = util_1.getThisExpression(node);
+                    const thisExpression = (0, util_1.getThisExpression)(node);
                     if (thisExpression &&
                         util.isTypeAnyType(util.getConstrainedTypeAtLocation(checker, esTreeNodeToTSNodeMap.get(thisExpression)))) {
diff --git a/dist/rules/no-unsafe-return.js b/dist/rules/no-unsafe-return.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/no-unsafe-return.js
+++ b/dist/rules/no-unsafe-return.js
@@ -110,5 +110,5 @@
                 if (!isNoImplicitThis) {
                     // `return this`
-                    const thisExpression = util_1.getThisExpression(returnNode);
+                    const thisExpression = (0, util_1.getThisExpression)(returnNode);
                     if (thisExpression &&
                         util.isTypeAnyType(util.getConstrainedTypeAtLocation(checker, esTreeNodeToTSNodeMap.get(thisExpression)))) {
diff --git a/dist/rules/object-curly-spacing.js b/dist/rules/object-curly-spacing.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/object-curly-spacing.js
+++ b/dist/rules/object-curly-spacing.js
@@ -7,5 +7,5 @@
 const object_curly_spacing_1 = __importDefault(require("eslint/lib/rules/object-curly-spacing"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'object-curly-spacing',
     meta: Object.assign(Object.assign({}, object_curly_spacing_1.default.meta), { docs: {
@@ -126,5 +126,5 @@
          */
         function validateBraceSpacing(node, first, second, penultimate, last) {
-            if (util_1.isTokenOnSameLine(first, second)) {
+            if ((0, util_1.isTokenOnSameLine)(first, second)) {
                 const firstSpaced = sourceCode.isSpaceBetween(first, second);
                 const secondType = sourceCode.getNodeByRangeIndex(second.range[0]).type;
@@ -145,9 +145,9 @@
                 }
             }
-            if (util_1.isTokenOnSameLine(penultimate, last)) {
+            if ((0, util_1.isTokenOnSameLine)(penultimate, last)) {
                 const shouldCheckPenultimate = (options.arraysInObjectsException &&
-                    util_1.isClosingBracketToken(penultimate)) ||
+                    (0, util_1.isClosingBracketToken)(penultimate)) ||
                     (options.objectsInObjectsException &&
-                        util_1.isClosingBraceToken(penultimate));
+                        (0, util_1.isClosingBraceToken)(penultimate));
                 const penultimateType = shouldCheckPenultimate
                     ? sourceCode.getNodeByRangeIndex(penultimate.range[0]).type
diff --git a/dist/rules/naming-convention-utils/parse-options.js b/dist/rules/naming-convention-utils/parse-options.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/naming-convention-utils/parse-options.js
+++ b/dist/rules/naming-convention-utils/parse-options.js
@@ -74,5 +74,5 @@
         ? option.selector
         : [option.selector];
-    return selectors.map(selector => (Object.assign({ selector: shared_1.isMetaSelector(selector)
+    return selectors.map(selector => (Object.assign({ selector: (0, shared_1.isMetaSelector)(selector)
             ? enums_1.MetaSelectors[selector]
             : enums_1.Selectors[selector] }, normalizedOption)));
@@ -83,5 +83,5 @@
         .reduce((acc, val) => acc.concat(val), []);
     return util.getEnumNames(enums_1.Selectors).reduce((acc, k) => {
-        acc[k] = validator_1.createValidator(k, context, normalizedOptions);
+        acc[k] = (0, validator_1.createValidator)(k, context, normalizedOptions);
         return acc;
     }, {});
diff --git a/dist/rules/prefer-includes.js b/dist/rules/prefer-includes.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-includes.js
+++ b/dist/rules/prefer-includes.js
@@ -24,5 +24,5 @@
 const ts = __importStar(require("typescript"));
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'prefer-includes',
     defaultOptions: [],
@@ -44,8 +44,8 @@
     create(context) {
         const globalScope = context.getScope();
-        const services = util_1.getParserServices(context);
+        const services = (0, util_1.getParserServices)(context);
         const types = services.program.getTypeChecker();
         function isNumber(node, value) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             return evaluated !== null && evaluated.value === value;
         }
@@ -98,9 +98,9 @@
          */
         function parseRegExp(node) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             if (evaluated == null || !(evaluated.value instanceof RegExp)) {
                 return null;
             }
-            const { pattern, flags } = regexpp_1.parseRegExpLiteral(evaluated.value);
+            const { pattern, flags } = (0, regexpp_1.parseRegExpLiteral)(evaluated.value);
             if (pattern.alternatives.length !== 1 ||
                 flags.ignoreCase ||
@@ -178,5 +178,5 @@
                 const argument = callNode.arguments[0];
                 const tsNode = services.esTreeNodeToTSNodeMap.get(argument);
-                const type = util_1.getConstrainedTypeAtLocation(types, tsNode);
+                const type = (0, util_1.getConstrainedTypeAtLocation)(types, tsNode);
                 const includesMethodDecl = (_a = type
                     .getProperty('includes')) === null || _a === void 0 ? void 0 : _a.getDeclarations();
diff --git a/dist/rules/prefer-literal-enum-member.js b/dist/rules/prefer-literal-enum-member.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-literal-enum-member.js
+++ b/dist/rules/prefer-literal-enum-member.js
@@ -3,5 +3,5 @@
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util_1 = require("../util");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'prefer-literal-enum-member',
     meta: {
diff --git a/dist/rules/prefer-readonly.js b/dist/rules/prefer-readonly.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-readonly.js
+++ b/dist/rules/prefer-readonly.js
@@ -216,5 +216,5 @@
         const modifierType = this.checker.getTypeAtLocation(node.expression);
         if (!modifierType.getSymbol() ||
-            !util_1.typeIsOrHasBaseType(modifierType, this.classType)) {
+            !(0, util_1.typeIsOrHasBaseType)(modifierType, this.classType)) {
             return;
         }
diff --git a/dist/rules/prefer-reduce-type-parameter.js b/dist/rules/prefer-reduce-type-parameter.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-reduce-type-parameter.js
+++ b/dist/rules/prefer-reduce-type-parameter.js
@@ -70,17 +70,22 @@
                         messageId: 'preferTypeParameter',
                         node: secondArg,
-                        fix: fixer => [
-                            fixer.removeRange([
-                                secondArg.range[0],
-                                secondArg.expression.range[0],
-                            ]),
-                            fixer.removeRange([
-                                secondArg.expression.range[1],
-                                secondArg.range[1],
-                            ]),
-                            fixer.insertTextAfter(callee, `<${context
-                                .getSourceCode()
-                                .getText(secondArg.typeAnnotation)}>`),
-                        ],
+                        fix: fixer => {
+                            const fixes = [
+                                fixer.removeRange([
+                                    secondArg.range[0],
+                                    secondArg.expression.range[0],
+                                ]),
+                                fixer.removeRange([
+                                    secondArg.expression.range[1],
+                                    secondArg.range[1],
+                                ]),
+                            ];
+                            if (!callee.parent.typeParameters) {
+                                fixes.push(fixer.insertTextAfter(callee, `<${context
+                                    .getSourceCode()
+                                    .getText(secondArg.typeAnnotation)}>`));
+                            }
+                            return fixes;
+                        },
                     });
                     return;
diff --git a/dist/rules/prefer-regexp-exec.js b/dist/rules/prefer-regexp-exec.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-regexp-exec.js
+++ b/dist/rules/prefer-regexp-exec.js
@@ -30,5 +30,5 @@
     ArgumentType[ArgumentType["Both"] = 3] = "Both";
 })(ArgumentType || (ArgumentType = {}));
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'prefer-regexp-exec',
     defaultOptions: [],
@@ -49,5 +49,5 @@
     create(context) {
         const globalScope = context.getScope();
-        const parserServices = util_1.getParserServices(context);
+        const parserServices = (0, util_1.getParserServices)(context);
         const typeChecker = parserServices.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
@@ -57,5 +57,5 @@
          */
         function isStringType(type) {
-            return util_1.getTypeName(typeChecker, type) === 'string';
+            return (0, util_1.getTypeName)(typeChecker, type) === 'string';
         }
         /**
@@ -64,5 +64,5 @@
          */
         function isRegExpType(type) {
-            return util_1.getTypeName(typeChecker, type) === 'RegExp';
+            return (0, util_1.getTypeName)(typeChecker, type) === 'RegExp';
         }
         function collectArgumentTypes(types) {
@@ -83,5 +83,5 @@
                 const callNode = memberNode.parent;
                 const argumentNode = callNode.arguments[0];
-                const argumentValue = util_1.getStaticValue(argumentNode, globalScope);
+                const argumentValue = (0, util_1.getStaticValue)(argumentNode, globalScope);
                 if (!isStringType(typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(objectNode)))) {
                     return;
@@ -99,5 +99,5 @@
                         node: memberNode.property,
                         messageId: 'regExpExecOverStringMatch',
-                        fix: util_1.getWrappingFixer({
+                        fix: (0, util_1.getWrappingFixer)({
                             sourceCode,
                             node: callNode,
@@ -114,5 +114,5 @@
                             node: memberNode.property,
                             messageId: 'regExpExecOverStringMatch',
-                            fix: util_1.getWrappingFixer({
+                            fix: (0, util_1.getWrappingFixer)({
                                 sourceCode,
                                 node: callNode,
@@ -125,5 +125,5 @@
                             node: memberNode.property,
                             messageId: 'regExpExecOverStringMatch',
-                            fix: util_1.getWrappingFixer({
+                            fix: (0, util_1.getWrappingFixer)({
                                 sourceCode,
                                 node: callNode,
diff --git a/dist/rules/prefer-string-starts-ends-with.js b/dist/rules/prefer-string-starts-ends-with.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/prefer-string-starts-ends-with.js
+++ b/dist/rules/prefer-string-starts-ends-with.js
@@ -6,5 +6,5 @@
 const EQ_OPERATORS = /^[=!]=/;
 const regexpp = new regexpp_1.RegExpParser();
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'prefer-string-starts-ends-with',
     defaultOptions: [],
@@ -27,5 +27,5 @@
         const globalScope = context.getScope();
         const sourceCode = context.getSourceCode();
-        const service = util_1.getParserServices(context);
+        const service = (0, util_1.getParserServices)(context);
         const typeChecker = service.program.getTypeChecker();
         /**
@@ -35,5 +35,5 @@
         function isStringType(node) {
             const objectType = typeChecker.getTypeAtLocation(service.esTreeNodeToTSNodeMap.get(node));
-            return util_1.getTypeName(typeChecker, objectType) === 'string';
+            return (0, util_1.getTypeName)(typeChecker, objectType) === 'string';
         }
         /**
@@ -42,5 +42,5 @@
          */
         function isNull(node) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             return evaluated != null && evaluated.value === null;
         }
@@ -51,5 +51,5 @@
          */
         function isNumber(node, value) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             return evaluated != null && evaluated.value === value;
         }
@@ -60,5 +60,5 @@
          */
         function isCharacter(node) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             return (evaluated != null &&
                 typeof evaluated.value === 'string' &&
@@ -107,9 +107,9 @@
         function isLengthExpression(node, expectedObjectNode) {
             if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression) {
-                return (util_1.getPropertyName(node, globalScope) === 'length' &&
+                return ((0, util_1.getPropertyName)(node, globalScope) === 'length' &&
                     isSameTokens(node.object, expectedObjectNode));
             }
-            const evaluatedLength = util_1.getStaticValue(node, globalScope);
-            const evaluatedString = util_1.getStaticValue(expectedObjectNode, globalScope);
+            const evaluatedLength = (0, util_1.getStaticValue)(node, globalScope);
+            const evaluatedString = (0, util_1.getStaticValue)(expectedObjectNode, globalScope);
             return (evaluatedLength != null &&
                 evaluatedString != null &&
@@ -192,5 +192,5 @@
          */
         function parseRegExp(node) {
-            const evaluated = util_1.getStaticValue(node, globalScope);
+            const evaluated = (0, util_1.getStaticValue)(node, globalScope);
             if (evaluated == null || !(evaluated.value instanceof RegExp)) {
                 return null;
@@ -261,5 +261,5 @@
         function getParent(node) {
             var _a;
-            return util_1.nullThrows(((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ChainExpression
+            return (0, util_1.nullThrows)(((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ChainExpression
                 ? node.parent.parent
                 : node.parent, util_1.NullThrowsReasons.MissingParent);
diff --git a/dist/rules/return-await.js b/dist/rules/return-await.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/return-await.js
+++ b/dist/rules/return-await.js
@@ -52,10 +52,14 @@
         const checker = parserServices.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
-        let scopeInfo = null;
+        const scopeInfoStack = [];
         function enterFunction(node) {
-            scopeInfo = {
+            scopeInfoStack.push({
                 hasAsync: node.async,
-            };
+                owningFunc: node,
+            });
         }
+        function exitFunction() {
+            scopeInfoStack.pop();
+        }
         function inTry(node) {
             let ancestor = node.parent;
@@ -123,5 +127,11 @@
         }
         function insertAwait(fixer, node) {
-            return fixer.insertTextBefore(node, 'await ');
+            if (node.type !== experimental_utils_1.AST_NODE_TYPES.TSAsExpression) {
+                return fixer.insertTextBefore(node, 'await ');
+            }
+            return [
+                fixer.insertTextBefore(node, 'await ('),
+                fixer.insertTextAfter(node, ')'),
+            ];
         }
         function test(node, expression) {
@@ -213,4 +223,8 @@
             FunctionExpression: enterFunction,
             ArrowFunctionExpression: enterFunction,
+            'FunctionDeclaration:exit': exitFunction,
+            'FunctionExpression:exit': exitFunction,
+            'ArrowFunctionExpression:exit': exitFunction,
+            // executes after less specific handler, so exitFunction is called
             'ArrowFunctionExpression[async = true]:exit'(node) {
                 if (node.body.type !== experimental_utils_1.AST_NODE_TYPES.BlockStatement) {
@@ -222,4 +236,5 @@
             },
             ReturnStatement(node) {
+                const scopeInfo = scopeInfoStack[scopeInfoStack.length - 1];
                 if (!scopeInfo || !scopeInfo.hasAsync || !node.argument) {
                     return;
diff --git a/dist/rules/sort-type-union-intersection-members.js b/dist/rules/sort-type-union-intersection-members.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/sort-type-union-intersection-members.js
+++ b/dist/rules/sort-type-union-intersection-members.js
@@ -123,5 +123,5 @@
                         items: {
                             type: 'string',
-                            enum: util_1.getEnumNames(Group),
+                            enum: (0, util_1.getEnumNames)(Group),
                         },
                     },
diff --git a/dist/rules/switch-exhaustiveness-check.js b/dist/rules/switch-exhaustiveness-check.js
index v4.28.5..v4.30.0 100644
--- a/dist/rules/switch-exhaustiveness-check.js
+++ b/dist/rules/switch-exhaustiveness-check.js
@@ -23,5 +23,5 @@
 const util_1 = require("../util");
 const tsutils_1 = require("tsutils");
-exports.default = util_1.createRule({
+exports.default = (0, util_1.createRule)({
     name: 'switch-exhaustiveness-check',
     meta: {
@@ -43,10 +43,10 @@
     create(context) {
         const sourceCode = context.getSourceCode();
-        const service = util_1.getParserServices(context);
+        const service = (0, util_1.getParserServices)(context);
         const checker = service.program.getTypeChecker();
         const compilerOptions = service.program.getCompilerOptions();
         function getNodeType(node) {
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
-            return util_1.getConstrainedTypeAtLocation(checker, tsNode);
+            return (0, util_1.getConstrainedTypeAtLocation)(checker, tsNode);
         }
         function fixSwitch(fixer, node, missingBranchTypes, symbolName) {
@@ -77,5 +77,5 @@
                 if (symbolName &&
                     (missingBranchName || missingBranchName === '') &&
-                    util_1.requiresQuoting(missingBranchName.toString(), compilerOptions.target)) {
+                    (0, util_1.requiresQuoting)(missingBranchName.toString(), compilerOptions.target)) {
                     caseTest = `${symbolName}['${missingBranchName}']`;
                 }
@@ -99,5 +99,5 @@
             const symbolName = (_a = discriminantType.getSymbol()) === null || _a === void 0 ? void 0 : _a.escapedName;
             if (discriminantType.isUnion()) {
-                const unionTypes = tsutils_1.unionTypePa

(too long so truncated)

  • Size: 2.1 MB → 2.2 MB (+23.6 KB)
  • Files: 424 → 427 (+3)

Posted by ybiquitous/npm-diff-action

@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.30.0 branch from 8c9f704 to f602286 Compare September 2, 2021 03:45
@ybiquitous ybiquitous changed the title chore(deps-dev): bump @typescript-eslint/eslint-plugin from 4.28.5 to 4.30.0 feat(deps): bump @typescript-eslint/eslint-plugin from 4.28.5 to 4.30.0 Sep 2, 2021
@ybiquitous ybiquitous merged commit 4e66049 into main Sep 2, 2021
@ybiquitous ybiquitous deleted the dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-4.30.0 branch September 2, 2021 04:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant