Repository: eslint/eslint
Pull request #15581 (2022-02-06 12:50:20)

fix: false positive in `camelcase` with combined properties


<!--
    Thank you for contributing!

    ESLint adheres to the [JS Foundation Code of Conduct](https://eslint.org/conduct).
-->

#### Prerequisites checklist

- [x] I have read the [contributing guidelines](https://github.com/eslint/eslint/blob/HEAD/CONTRIBUTING.md).

#### What is the purpose of this pull request? (put an "X" next to an item)

<!--
    The following template is intentionally not a markdown checkbox list for the reasons
    explained in https://github.com/eslint/eslint/pull/12848#issuecomment-580302888
-->

[ ] Documentation update
[x] Bug fix ([template](https://raw.githubusercontent.com/eslint/eslint/HEAD/templates/bug-report.md))
[ ] New rule ([template](https://raw.githubusercontent.com/eslint/eslint/HEAD/templates/rule-proposal.md))
[ ] Changes an existing rule ([template](https://raw.githubusercontent.com/eslint/eslint/HEAD/templates/rule-change-proposal.md))
[ ] Add autofix to a rule
[ ] Add a CLI option
[ ] Add something to the core
[ ] Other, please explain:

<!--
    If the item you've checked above has a template, please paste the template questions below and answer them. (If this pull request is addressing an issue, you can just paste a link to the issue here instead.)
-->

<!--
    Please ensure your pull request is ready:

    - Read the pull request guide (https://eslint.org/docs/developer-guide/contributing/pull-requests)
    - Include tests for this change
    - Update documentation for this change (if appropriate)
-->

<!--
    The following is required for all pull requests:
-->

#### What changes did you make? (Give an overview)

Fix https://github.com/eslint/eslint/issues/15572

```js
/*eslint camelcase: ["error", {"properties": "never", ignoreDestructuring: true}]*/

var { some_property } = obj; // OK
doSomething({ some_property }); // OK
```

#### Is there anything you'd like reviewers to focus on?

No
<!-- markdownlint-disable-file MD004 -->


eslint-github-bot[bot]: Hi @snitin315!, thanks for the Pull Request

The **first commit message** isn't properly formatted. We ask that you update the message to match this format, as we use it to generate changelogs and automate releases.

- The length of the commit message must be less than or equal to 72

**To Fix:** You can fix this problem by running `git commit --amend`, editing your commit message, and then running `git push -f` to update this pull request.

Read more about contributing to ESLint [here](https://eslint.org/docs/developer-guide/contributing/)


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28cb44890..15e98f4c1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+v8.9.0 - February 11, 2022
+
+* [`68f64a9`](https://github.com/eslint/eslint/commit/68f64a9218341e5e9d83270c72587e1b413846de) feat: update eslint-scope to ignore `"use strict"` directives in ES3 (#15595) (Milos Djermanovic)
+* [`db57639`](https://github.com/eslint/eslint/commit/db576396d20f5e31af1a90f8e5d88e08284a1672) feat: add `es2016`, `es2018`, `es2019`, and `es2022` environments (#15587) (Milos Djermanovic)
+* [`586d45c`](https://github.com/eslint/eslint/commit/586d45c54b8468fb23376b7b2aedf984cf701cc2) chore: Upgrade to espree@9.3.1 (#15600) (Milos Djermanovic)
+* [`623e1e2`](https://github.com/eslint/eslint/commit/623e1e28643381025b393a379493d9baea9b4869) chore: Upgrade to eslint-visitor-keys@3.3.0 (#15599) (Milos Djermanovic)
+* [`570a036`](https://github.com/eslint/eslint/commit/570a03699c5abfbcde39bb00fba39329695771e5) docs: add `one-var` example with `for-loop` initializer (#15596) (Milos Djermanovic)
+* [`2dc38aa`](https://github.com/eslint/eslint/commit/2dc38aa653f1d5137a9abf82024c67a11620bb7c) feat: fix bug with arrow function return types in function-paren-newline (#15541) (Milos Djermanovic)
+* [`355b23d`](https://github.com/eslint/eslint/commit/355b23d0c4e050be4e53292f552a47c10ec6e00e) chore: fix outdated link to Code of Conduct in PR template (#15578) (Rich Trott)
+* [`417191d`](https://github.com/eslint/eslint/commit/417191dff0dbfa353675c409e25f27f578ee1559) docs: Remove the $ prefix in terminal commands (#15565) (Andreas Lewis)
+* [`389ff34`](https://github.com/eslint/eslint/commit/389ff34e26cb8ebad49e5ace0280a1f859f8d7ca) docs: add missing `Variable#scope` property in the scope manager docs (#15571) (Milos Djermanovic)
+* [`b10fef2`](https://github.com/eslint/eslint/commit/b10fef25c99134d514fec4ddde19302661db5974) ci: use Node 16 for browser test (#15569) (Milos Djermanovic)
+* [`f63795d`](https://github.com/eslint/eslint/commit/f63795dc710f6394d884932034a3e0cbe48f4ad2) docs: no-eval replace dead link with working one (#15568) (rasenplanscher)
+* [`6f940c3`](https://github.com/eslint/eslint/commit/6f940c3ce715327f282c197d0f71b91848e5d83d) feat: Implement FlatRuleTester (#15519) (Nicholas C. Zakas)
+* [`0383591`](https://github.com/eslint/eslint/commit/0383591a6cd7083455af9e34fa9333da7fed46bf) docs: Remove old Markdown issue template (#15556) (Brandon Mills)
+* [`92f89fb`](https://github.com/eslint/eslint/commit/92f89fb0647fef10468fd70d6782a845d75330e3) chore: suggest demo link in bug report template (#15557) (Brandon Mills)
+* [`a8dd5a2`](https://github.com/eslint/eslint/commit/a8dd5a286bcb68595b85cd29490e081251a2c3c7) docs: add 'when not to use it' section in no-duplicate-case docs (#15563) (Milos Djermanovic)
+* [`1ad439e`](https://github.com/eslint/eslint/commit/1ad439ed1d6c4ee50183c8f5d146a771e6c1be4c) docs: add missed verb in docs (#15550) (Jeff Mosawy)
+
 v8.8.0 - January 28, 2022
 
 * [`5d60812`](https://github.com/eslint/eslint/commit/5d60812d440762dff72420714273c714c4c5d074) feat: implement rfc 2021-suppression-support (#15459) (Yiwei Ding)
diff --git a/README.md b/README.md
index 63bff9ae8..fe9812dcc 100644
--- a/README.md
+++ b/README.md
@@ -291,10 +291,10 @@ The following companies, organizations, and individuals support ESLint's ongoing
 <!-- NOTE: This section is autogenerated. Do not manually edit.-->
 <!--sponsorsstart-->
 <h3>Platinum Sponsors</h3>
-<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3>
+<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a> <a href="https://flux.industries"><img src="https://avatars.githubusercontent.com/u/88303769?u=1af1d13b48676ab5918770999361829fc90847c4&v=4" alt="Flux Industries" height="undefined"></a></p><h3>Gold Sponsors</h3>
 <p><a href="https://contra.com"><img src="https://images.opencollective.com/contra1/c70f93f/logo.png" alt="Contra" height="96"></a> <a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="96"></a> <a href="https://google.com/chrome"><img src="https://images.opencollective.com/chrome/dc55bd4/logo.png" alt="Chrome's Web Framework & Tools Performance Fund" height="96"></a> <a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301?v=4" alt="American Express" height="96"></a> <a href="https://substack.com/"><img src="https://avatars.githubusercontent.com/u/53023767?v=4" alt="Substack" height="96"></a></p><h3>Silver Sponsors</h3>
 <p><a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a></p><h3>Bronze Sponsors</h3>
-<p><a href="https://launchdarkly.com"><img src="https://images.opencollective.com/launchdarkly/574bb9e/logo.png" alt="launchdarkly" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.practiceignition.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Practice Ignition" height="32"></a></p>
+<p><a href="https://launchdarkly.com"><img src="https://images.opencollective.com/launchdarkly/574bb9e/logo.png" alt="launchdarkly" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.ignitionapp.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Practice Ignition" height="32"></a></p>
 <!--sponsorsend-->
 
 ## <a name="technology-sponsors"></a>Technology Sponsors
diff --git a/docs/rules/one-var.md b/docs/rules/one-var.md
index b19ac515b..aa971eaf8 100644
--- a/docs/rules/one-var.md
+++ b/docs/rules/one-var.md
@@ -242,6 +242,11 @@ class C {
         let qux;
     }
 }
+
+// declarations with multiple variables are allowed in for-loop initializers
+for (var i = 0, len = arr.length; i < len; i++) {
+    doSomething(arr[i]);
+}
 ```
 
 ### consecutive
diff --git a/docs/user-guide/configuring/language-options.md b/docs/user-guide/configuring/language-options.md
index d44959df2..6ba406b82 100644
--- a/docs/user-guide/configuring/language-options.md
+++ b/docs/user-guide/configuring/language-options.md
@@ -13,9 +13,13 @@ An environment provides predefined global variables. The available environments
 * `commonjs` - CommonJS global variables and CommonJS scoping (use this for browser-only code that uses Browserify/WebPack).
 * `shared-node-browser` - Globals common to both Node.js and Browser.
 * `es6` - enable all ECMAScript 6 features except for modules (this automatically sets the `ecmaVersion` parser option to 6).
+* `es2016` - adds all ECMAScript 2016 globals and automatically sets the `ecmaVersion` parser option to 7.
 * `es2017` - adds all ECMAScript 2017 globals and automatically sets the `ecmaVersion` parser option to 8.
+* `es2018` - adds all ECMAScript 2018 globals and automatically sets the `ecmaVersion` parser option to 9.
+* `es2019` - adds all ECMAScript 2019 globals and automatically sets the `ecmaVersion` parser option to 10.
 * `es2020` - adds all ECMAScript 2020 globals and automatically sets the `ecmaVersion` parser option to 11.
 * `es2021` - adds all ECMAScript 2021 globals and automatically sets the `ecmaVersion` parser option to 12.
+* `es2022` - adds all ECMAScript 2022 globals and automatically sets the `ecmaVersion` parser option to 13.
 * `worker` - web workers global variables.
 * `amd` - defines `require()` and `define()` as global variables as per the [amd](https://github.com/amdjs/amdjs-api/wiki/AMD) spec.
 * `mocha` - adds all of the Mocha testing global variables.
diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js
index 6bb1838a7..e47614669 100644
--- a/lib/rules/camelcase.js
+++ b/lib/rules/camelcase.js
@@ -146,7 +146,7 @@ module.exports = {
 
         /**
          * Checks if a given binding identifier uses the original name as-is.
-         * - If it's in object destructuring, the original name is its property name.
+         * - If it's in object destructuring or object expression, the original name is its property name.
          * - If it's in import declaration, the original name is its exported name.
          * @param {ASTNode} node The `Identifier` node to check.
          * @returns {boolean} `true` if the identifier uses the original name as-is.
@@ -161,7 +161,7 @@ module.exports = {
             switch (parent.type) {
                 case "Property":
                     return (
-                        parent.parent.type === "ObjectPattern" &&
+                        (parent.parent.type === "ObjectPattern" || parent.parent.type === "ObjectExpression") &&
                         parent.value === valueNode &&
                         !parent.computed &&
                         parent.key.type === "Identifier" &&
diff --git a/lib/rules/function-paren-newline.js b/lib/rules/function-paren-newline.js
index ed94fad46..898e113ee 100644
--- a/lib/rules/function-paren-newline.js
+++ b/lib/rules/function-paren-newline.js
@@ -227,9 +227,13 @@ module.exports = {
                         return null;
                     }
 
+                    const rightParen = node.params.length
+                        ? sourceCode.getTokenAfter(node.params[node.params.length - 1], astUtils.isClosingParenToken)
+                        : sourceCode.getTokenAfter(firstToken);
+
                     return {
                         leftParen: firstToken,
-                        rightParen: sourceCode.getTokenBefore(node.body, astUtils.isClosingParenToken)
+                        rightParen
                     };
                 }
 
diff --git a/package.json b/package.json
index ff67418ec..b9018f7f0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint",
-  "version": "8.8.0",
+  "version": "8.9.0",
   "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
   "description": "An AST-based pattern checker for JavaScript.",
   "bin": {
@@ -47,7 +47,7 @@
   "homepage": "https://eslint.org",
   "bugs": "https://github.com/eslint/eslint/issues/",
   "dependencies": {
-    "@eslint/eslintrc": "^1.0.5",
+    "@eslint/eslintrc": "^1.1.0",
     "@humanwhocodes/config-array": "^0.9.2",
     "ajv": "^6.10.0",
     "chalk": "^4.0.0",
@@ -55,10 +55,10 @@
     "debug": "^4.3.2",
     "doctrine": "^3.0.0",
     "escape-string-regexp": "^4.0.0",
-    "eslint-scope": "^7.1.0",
+    "eslint-scope": "^7.1.1",
     "eslint-utils": "^3.0.0",
-    "eslint-visitor-keys": "^3.2.0",
-    "espree": "^9.3.0",
+    "eslint-visitor-keys": "^3.3.0",
+    "espree": "^9.3.1",
     "esquery": "^1.4.0",
     "esutils": "^2.0.2",
     "fast-deep-equal": "^3.1.3",


Test patch:
diff --git a/tests/fixtures/parsers/function-paren-newline/arrow-function-return-type.js b/tests/fixtures/parsers/function-paren-newline/arrow-function-return-type.js
new file mode 100644
index 000000000..dbd9d48ed
--- /dev/null
+++ b/tests/fixtures/parsers/function-paren-newline/arrow-function-return-type.js
@@ -0,0 +1,660 @@
+"use strict";
+
+/**
+ * Parser: @typescript-eslint/parser@5.10.1
+ * Source code:
+ * const method6 = (
+ *   abc: number,
+ *   def: () => void,
+ * ): [
+ *  string,
+ *  () => void
+ * ] => [`a${abc}`, def];
+ * method6(3, () => {});
+ */
+
+ exports.parse = () => ({
+  type: "Program",
+  body: [
+      {
+          type: "VariableDeclaration",
+          declarations: [
+              {
+                  type: "VariableDeclarator",
+                  id: {
+                      type: "Identifier",
+                      name: "method6",
+                      range: [6, 13],
+                      loc: {
+                          start: { line: 1, column: 6 },
+                          end: { line: 1, column: 13 },
+                      },
+                  },
+                  init: {
+                      type: "ArrowFunctionExpression",
+                      generator: false,
+                      id: null,
+                      params: [
+                          {
+                              type: "Identifier",
+                              name: "abc",
+                              range: [20, 31],
+                              loc: {
+                                  start: { line: 2, column: 2 },
+                                  end: { line: 2, column: 13 },
+                              },
+                              typeAnnotation: {
+                                  type: "TSTypeAnnotation",
+                                  loc: {
+                                      start: { line: 2, column: 5 },
+                                      end: { line: 2, column: 13 },
+                                  },
+                                  range: [23, 31],
+                                  typeAnnotation: {
+                                      type: "TSNumberKeyword",
+                                      range: [25, 31],
+                                      loc: {
+                                          start: { line: 2, column: 7 },
+                                          end: { line: 2, column: 13 },
+                                      },
+                                  },
+                              },
+                          },
+                          {
+                              type: "Identifier",
+                              name: "def",
+                              range: [35, 50],
+                              loc: {
+                                  start: { line: 3, column: 2 },
+                                  end: { line: 3, column: 17 },
+                              },
+                              typeAnnotation: {
+                                  type: "TSTypeAnnotation",
+                                  loc: {
+                                      start: { line: 3, column: 5 },
+                                      end: { line: 3, column: 17 },
+                                  },
+                                  range: [38, 50],
+                                  typeAnnotation: {
+                                      type: "TSFunctionType",
+                                      params: [],
+                                      range: [40, 50],
+                                      loc: {
+                                          start: { line: 3, column: 7 },
+                                          end: { line: 3, column: 17 },
+                                      },
+                                      returnType: {
+                                          type: "TSTypeAnnotation",
+                                          loc: {
+                                              start: { line: 3, column: 10 },
+                                              end: { line: 3, column: 17 },
+                                          },
+                                          range: [43, 50],
+                                          typeAnnotation: {
+                                              type: "TSVoidKeyword",
+                                              range: [46, 50],
+                                              loc: {
+                                                  start: {
+                                                      line: 3,
+                                                      column: 13,
+                                                  },
+                                                  end: {
+                                                      line: 3,
+                                                      column: 17,
+                                                  },
+                                              },
+                                          },
+                                      },
+                                  },
+                              },
+                          },
+                      ],
+                      body: {
+                          type: "ArrayExpression",
+                          elements: [
+                              {
+                                  type: "TemplateLiteral",
+                                  quasis: [
+                                      {
+                                          type: "TemplateElement",
+                                          value: { raw: "a", cooked: "a" },
+                                          tail: false,
+                                          range: [86, 90],
+                                          loc: {
+                                              start: { line: 7, column: 6 },
+                                              end: { line: 7, column: 10 },
+                                          },
+                                      },
+                                      {
+                                          type: "TemplateElement",
+                                          value: { raw: "", cooked: "" },
+                                          tail: true,
+                                          range: [93, 95],
+                                          loc: {
+                                              start: { line: 7, column: 13 },
+                                              end: { line: 7, column: 15 },
+                                          },
+                                      },
+                                  ],
+                                  expressions: [
+                                      {
+                                          type: "Identifier",
+                                          name: "abc",
+                                          range: [90, 93],
+                                          loc: {
+                                              start: { line: 7, column: 10 },
+                                              end: { line: 7, column: 13 },
+                                          },
+                                      },
+                                  ],
+                                  range: [86, 95],
+                                  loc: {
+                                      start: { line: 7, column: 6 },
+                                      end: { line: 7, column: 15 },
+                                  },
+                              },
+                              {
+                                  type: "Identifier",
+                                  name: "def",
+                                  range: [97, 100],
+                                  loc: {
+                                      start: { line: 7, column: 17 },
+                                      end: { line: 7, column: 20 },
+                                  },
+                              },
+                          ],
+                          range: [85, 101],
+                          loc: {
+                              start: { line: 7, column: 5 },
+                              end: { line: 7, column: 21 },
+                          },
+                      },
+                      async: false,
+                      expression: true,
+                      range: [16, 101],
+                      loc: {
+                          start: { line: 1, column: 16 },
+                          end: { line: 7, column: 21 },
+                      },
+                      returnType: {
+                          type: "TSTypeAnnotation",
+                          loc: {
+                              start: { line: 4, column: 1 },
+                              end: { line: 7, column: 1 },
+                          },
+                          range: [53, 81],
+                          typeAnnotation: {
+                              type: "TSTupleType",
+                              elementTypes: [
+                                  {
+                                      type: "TSStringKeyword",
+                                      range: [59, 65],
+                                      loc: {
+                                          start: { line: 5, column: 2 },
+                                          end: { line: 5, column: 8 },
+                                      },
+                                  },
+                                  {
+                                      type: "TSFunctionType",
+                                      params: [],
+                                      range: [69, 79],
+                                      loc: {
+                                          start: { line: 6, column: 2 },
+                                          end: { line: 6, column: 12 },
+                                      },
+                                      returnType: {
+                                          type: "TSTypeAnnotation",
+                                          loc: {
+                                              start: { line: 6, column: 5 },
+                                              end: { line: 6, column: 12 },
+                                          },
+                                          range: [72, 79],
+                                          typeAnnotation: {
+                                              type: "TSVoidKeyword",
+                                              range: [75, 79],
+                                              loc: {
+                                                  start: {
+                                                      line: 6,
+                                                      column: 8,
+                                                  },
+                                                  end: {
+                                                      line: 6,
+                                                      column: 12,
+                                                  },
+                                              },
+                                          },
+                                      },
+                                  },
+                              ],
+                              range: [55, 81],
+                              loc: {
+                                  start: { line: 4, column: 3 },
+                                  end: { line: 7, column: 1 },
+                              },
+                          },
+                      },
+                  },
+                  range: [6, 101],
+                  loc: {
+                      start: { line: 1, column: 6 },
+                      end: { line: 7, column: 21 },
+                  },
+              },
+          ],
+          kind: "const",
+          range: [0, 102],
+          loc: {
+              start: { line: 1, column: 0 },
+              end: { line: 7, column: 22 },
+          },
+      },
+      {
+          type: "ExpressionStatement",
+          expression: {
+              type: "CallExpression",
+              callee: {
+                  type: "Identifier",
+                  name: "method6",
+                  range: [103, 110],
+                  loc: {
+                      start: { line: 8, column: 0 },
+                      end: { line: 8, column: 7 },
+                  },
+              },
+              arguments: [
+                  {
+                      type: "Literal",
+                      value: 3,
+                      raw: "3",
+                      range: [111, 112],
+                      loc: {
+                          start: { line: 8, column: 8 },
+                          end: { line: 8, column: 9 },
+                      },
+                  },
+                  {
+                      type: "ArrowFunctionExpression",
+                      generator: false,
+                      id: null,
+                      params: [],
+                      body: {
+                          type: "BlockStatement",
+                          body: [],
+                          range: [120, 122],
+                          loc: {
+                              start: { line: 8, column: 17 },
+                              end: { line: 8, column: 19 },
+                          },
+                      },
+                      async: false,
+                      expression: false,
+                      range: [114, 122],
+                      loc: {
+                          start: { line: 8, column: 11 },
+                          end: { line: 8, column: 19 },
+                      },
+                  },
+              ],
+              optional: false,
+              range: [103, 123],
+              loc: {
+                  start: { line: 8, column: 0 },
+                  end: { line: 8, column: 20 },
+              },
+          },
+          range: [103, 124],
+          loc: {
+              start: { line: 8, column: 0 },
+              end: { line: 8, column: 21 },
+          },
+      },
+  ],
+  sourceType: "script",
+  range: [0, 125],
+  loc: { start: { line: 1, column: 0 }, end: { line: 9, column: 0 } },
+  tokens: [
+      {
+          type: "Keyword",
+          value: "const",
+          range: [0, 5],
+          loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } },
+      },
+      {
+          type: "Identifier",
+          value: "method6",
+          range: [6, 13],
+          loc: {
+              start: { line: 1, column: 6 },
+              end: { line: 1, column: 13 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "=",
+          range: [14, 15],
+          loc: {
+              start: { line: 1, column: 14 },
+              end: { line: 1, column: 15 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "(",
+          range: [16, 17],
+          loc: {
+              start: { line: 1, column: 16 },
+              end: { line: 1, column: 17 },
+          },
+      },
+      {
+          type: "Identifier",
+          value: "abc",
+          range: [20, 23],
+          loc: { start: { line: 2, column: 2 }, end: { line: 2, column: 5 } },
+      },
+      {
+          type: "Punctuator",
+          value: ":",
+          range: [23, 24],
+          loc: { start: { line: 2, column: 5 }, end: { line: 2, column: 6 } },
+      },
+      {
+          type: "Identifier",
+          value: "number",
+          range: [25, 31],
+          loc: {
+              start: { line: 2, column: 7 },
+              end: { line: 2, column: 13 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ",",
+          range: [31, 32],
+          loc: {
+              start: { line: 2, column: 13 },
+              end: { line: 2, column: 14 },
+          },
+      },
+      {
+          type: "Identifier",
+          value: "def",
+          range: [35, 38],
+          loc: { start: { line: 3, column: 2 }, end: { line: 3, column: 5 } },
+      },
+      {
+          type: "Punctuator",
+          value: ":",
+          range: [38, 39],
+          loc: { start: { line: 3, column: 5 }, end: { line: 3, column: 6 } },
+      },
+      {
+          type: "Punctuator",
+          value: "(",
+          range: [40, 41],
+          loc: { start: { line: 3, column: 7 }, end: { line: 3, column: 8 } },
+      },
+      {
+          type: "Punctuator",
+          value: ")",
+          range: [41, 42],
+          loc: { start: { line: 3, column: 8 }, end: { line: 3, column: 9 } },
+      },
+      {
+          type: "Punctuator",
+          value: "=>",
+          range: [43, 45],
+          loc: {
+              start: { line: 3, column: 10 },
+              end: { line: 3, column: 12 },
+          },
+      },
+      {
+          type: "Keyword",
+          value: "void",
+          range: [46, 50],
+          loc: {
+              start: { line: 3, column: 13 },
+              end: { line: 3, column: 17 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ",",
+          range: [50, 51],
+          loc: {
+              start: { line: 3, column: 17 },
+              end: { line: 3, column: 18 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ")",
+          range: [52, 53],
+          loc: { start: { line: 4, column: 0 }, end: { line: 4, column: 1 } },
+      },
+      {
+          type: "Punctuator",
+          value: ":",
+          range: [53, 54],
+          loc: { start: { line: 4, column: 1 }, end: { line: 4, column: 2 } },
+      },
+      {
+          type: "Punctuator",
+          value: "[",
+          range: [55, 56],
+          loc: { start: { line: 4, column: 3 }, end: { line: 4, column: 4 } },
+      },
+      {
+          type: "Identifier",
+          value: "string",
+          range: [59, 65],
+          loc: { start: { line: 5, column: 2 }, end: { line: 5, column: 8 } },
+      },
+      {
+          type: "Punctuator",
+          value: ",",
+          range: [65, 66],
+          loc: { start: { line: 5, column: 8 }, end: { line: 5, column: 9 } },
+      },
+      {
+          type: "Punctuator",
+          value: "(",
+          range: [69, 70],
+          loc: { start: { line: 6, column: 2 }, end: { line: 6, column: 3 } },
+      },
+      {
+          type: "Punctuator",
+          value: ")",
+          range: [70, 71],
+          loc: { start: { line: 6, column: 3 }, end: { line: 6, column: 4 } },
+      },
+      {
+          type: "Punctuator",
+          value: "=>",
+          range: [72, 74],
+          loc: { start: { line: 6, column: 5 }, end: { line: 6, column: 7 } },
+      },
+      {
+          type: "Keyword",
+          value: "void",
+          range: [75, 79],
+          loc: {
+              start: { line: 6, column: 8 },
+              end: { line: 6, column: 12 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "]",
+          range: [80, 81],
+          loc: { start: { line: 7, column: 0 }, end: { line: 7, column: 1 } },
+      },
+      {
+          type: "Punctuator",
+          value: "=>",
+          range: [82, 84],
+          loc: { start: { line: 7, column: 2 }, end: { line: 7, column: 4 } },
+      },
+      {
+          type: "Punctuator",
+          value: "[",
+          range: [85, 86],
+          loc: { start: { line: 7, column: 5 }, end: { line: 7, column: 6 } },
+      },
+      {
+          type: "Template",
+          value: "`a${",
+          range: [86, 90],
+          loc: {
+              start: { line: 7, column: 6 },
+              end: { line: 7, column: 10 },
+          },
+      },
+      {
+          type: "Identifier",
+          value: "abc",
+          range: [90, 93],
+          loc: {
+              start: { line: 7, column: 10 },
+              end: { line: 7, column: 13 },
+          },
+      },
+      {
+          type: "Template",
+          value: "}`",
+          range: [93, 95],
+          loc: {
+              start: { line: 7, column: 13 },
+              end: { line: 7, column: 15 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ",",
+          range: [95, 96],
+          loc: {
+              start: { line: 7, column: 15 },
+              end: { line: 7, column: 16 },
+          },
+      },
+      {
+          type: "Identifier",
+          value: "def",
+          range: [97, 100],
+          loc: {
+              start: { line: 7, column: 17 },
+              end: { line: 7, column: 20 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "]",
+          range: [100, 101],
+          loc: {
+              start: { line: 7, column: 20 },
+              end: { line: 7, column: 21 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ";",
+          range: [101, 102],
+          loc: {
+              start: { line: 7, column: 21 },
+              end: { line: 7, column: 22 },
+          },
+      },
+      {
+          type: "Identifier",
+          value: "method6",
+          range: [103, 110],
+          loc: { start: { line: 8, column: 0 }, end: { line: 8, column: 7 } },
+      },
+      {
+          type: "Punctuator",
+          value: "(",
+          range: [110, 111],
+          loc: { start: { line: 8, column: 7 }, end: { line: 8, column: 8 } },
+      },
+      {
+          type: "Numeric",
+          value: "3",
+          range: [111, 112],
+          loc: { start: { line: 8, column: 8 }, end: { line: 8, column: 9 } },
+      },
+      {
+          type: "Punctuator",
+          value: ",",
+          range: [112, 113],
+          loc: {
+              start: { line: 8, column: 9 },
+              end: { line: 8, column: 10 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "(",
+          range: [114, 115],
+          loc: {
+              start: { line: 8, column: 11 },
+              end: { line: 8, column: 12 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ")",
+          range: [115, 116],
+          loc: {
+              start: { line: 8, column: 12 },
+              end: { line: 8, column: 13 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "=>",
+          range: [117, 119],
+          loc: {
+              start: { line: 8, column: 14 },
+              end: { line: 8, column: 16 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "{",
+          range: [120, 121],
+          loc: {
+              start: { line: 8, column: 17 },
+              end: { line: 8, column: 18 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: "}",
+          range: [121, 122],
+          loc: {
+              start: { line: 8, column: 18 },
+              end: { line: 8, column: 19 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ")",
+          range: [122, 123],
+          loc: {
+              start: { line: 8, column: 19 },
+              end: { line: 8, column: 20 },
+          },
+      },
+      {
+          type: "Punctuator",
+          value: ";",
+          range: [123, 124],
+          loc: {
+              start: { line: 8, column: 20 },
+              end: { line: 8, column: 21 },
+          },
+      },
+  ],
+  comments: [],
+});
diff --git a/tests/lib/rules/camelcase.js b/tests/lib/rules/camelcase.js
index 3a47a1b4b..79c237ce2 100644
--- a/tests/lib/rules/camelcase.js
+++ b/tests/lib/rules/camelcase.js
@@ -407,6 +407,35 @@ ruleTester.run("camelcase", rule, {
             code: "class C { snake_case; #snake_case; #snake_case2() {} }",
             options: [{ properties: "never" }],
             parserOptions: { ecmaVersion: 2022 }
+        },
+
+        // Combinations of `properties` and `ignoreDestructring`
+        {
+            code: `
+            const { some_property } = obj;
+
+            const bar = { some_property };
+
+            obj.some_property = 10;
+
+            const xyz = { some_property: obj.some_property };
+
+            const foo = ({ some_property }) => {
+                console.log(some_property)
+            };
+            `,
+            options: [{ properties: "never", ignoreDestructuring: true }],
+            parserOptions: { ecmaVersion: 2022 }
+        },
+
+        // https://github.com/eslint/eslint/issues/15572
+        {
+            code: `
+            const { some_property } = obj;
+            doSomething({ some_property });
+            `,
+            options: [{ properties: "never", ignoreDestructuring: true }],
+            parserOptions: { ecmaVersion: 2022 }
         }
     ],
     invalid: [
@@ -1416,6 +1445,78 @@ ruleTester.run("camelcase", rule, {
             options: [{ properties: "always" }],
             parserOptions: { ecmaVersion: 2022 },
             errors: [{ messageId: "notCamelCasePrivate", data: { name: "snake_case" } }]
+        },
+
+        // Combinations of `properties` and `ignoreDestructring`
+        {
+            code: `
+            const { some_property } = obj;
+            doSomething({ some_property });
+            `,
+            options: [{ properties: "always", ignoreDestructuring: true }],
+            parserOptions: { ecmaVersion: 2022 },
+            errors: [
+                {
+                    messageId: "notCamelCase",
+                    data: { name: "some_property" },
+                    line: 3,
+                    column: 27
+                }
+            ]
+        },
+        {
+            code: `
+            const { some_property } = obj;
+            doSomething({ some_property });
+            doSomething({ [some_property]: "bar" });
+            `,
+            options: [{ properties: "never", ignoreDestructuring: true }],
+            parserOptions: { ecmaVersion: 2022 },
+            errors: [
+                {
+                    messageId: "notCamelCase",
+                    data: { name: "some_property" },
+                    line: 4,
+                    column: 28
+                }
+            ]
+        },
+        {
+            code: `
+            const { some_property } = obj;
+
+            const bar = { some_property };
+
+            obj.some_property = 10;
+
+            const xyz = { some_property: obj.some_property };
+
+            const foo = ({ some_property }) => {
+                console.log(some_property)
+            };
+            `,
+            options: [{ properties: "always", ignoreDestructuring: true }],
+            parserOptions: { ecmaVersion: 2022 },
+            errors: [
+                {
+                    messageId: "notCamelCase",
+                    data: { name: "some_property" },
+                    line: 4,
+                    column: 27
+                },
+                {
+                    messageId: "notCamelCase",
+                    data: { name: "some_property" },
+                    line: 6,
+                    column: 17
+                },
+                {
+                    messageId: "notCamelCase",
+                    data: { name: "some_property" },
+                    line: 8,
+                    column: 27
+                }
+            ]
         }
     ]
 });
diff --git a/tests/lib/rules/function-paren-newline.js b/tests/lib/rules/function-paren-newline.js
index 0c9feb7a7..048370f35 100644
--- a/tests/lib/rules/function-paren-newline.js
+++ b/tests/lib/rules/function-paren-newline.js
@@ -11,6 +11,9 @@
 const rule = require("../../../lib/rules/function-paren-newline");
 const { RuleTester } = require("../../../lib/rule-tester");
 
+const { unIndent } = require("../../_utils");
+const fixtureParser = require("../../fixtures/fixture-parser");
+
 
 //------------------------------------------------------------------------------
 // Tests
@@ -583,6 +586,22 @@ ruleTester.run("function-paren-newline", rule, {
             code: "import(\n  source\n)",
             options: ["consistent"],
             parserOptions: { ecmaVersion: 2020 }
+        },
+
+        // https://github.com/eslint/eslint/issues/15091#issuecomment-975605821
+        {
+            code: unIndent`
+                const method6 = (
+                  abc: number,
+                  def: () => void,
+                ): [
+                  string,
+                  () => void
+                ] => [\`a\${abc}\`, def];
+                method6(3, () => {});
+            `,
+            options: ["multiline"],
+            parser: fixtureParser("function-paren-newline", "arrow-function-return-type")
         }
     ],
 
@@ -1437,6 +1456,31 @@ ruleTester.run("function-paren-newline", rule, {
             options: ["consistent"],
             parserOptions: { ecmaVersion: 2020 },
             errors: [RIGHT_MISSING_ERROR]
+        },
+
+        // https://github.com/eslint/eslint/issues/15091#issuecomment-975605821
+        {
+            code: unIndent`
+                const method6 = (
+                  abc: number,
+                  def: () => void,
+                ): [
+                  string,
+                  () => void
+                ] => [\`a\${abc}\`, def];
+                method6(3, () => {});
+            `,
+            output: unIndent`
+                const method6 = (abc: number,
+                  def: () => void,): [
+                  string,
+                  () => void
+                ] => [\`a\${abc}\`, def];
+                method6(3, () => {});
+            `,
+            options: ["never"],
+            parser: fixtureParser("function-paren-newline", "arrow-function-return-type"),
+            errors: [LEFT_UNEXPECTED_ERROR, RIGHT_UNEXPECTED_ERROR]
         }
     ]
 });
diff --git a/tests/lib/rules/no-eval.js b/tests/lib/rules/no-eval.js
index 79ba4a1eb..b084892cf 100644
--- a/tests/lib/rules/no-eval.js
+++ b/tests/lib/rules/no-eval.js
@@ -139,6 +139,13 @@ ruleTester.run("no-eval", rule, {
             code: "class A { static {} [this.eval()]; }",
             parserOptions: { ecmaVersion: 2022 },
             errors: [{ messageId: "unexpected" }]
+        },
+
+        // in es3, "use strict" directives do not apply
+        {
+            code: "function foo() { 'use strict'; this.eval(); }",
+            parserOptions: { ecmaVersion: 3 },
+            errors: [{ messageId: "unexpected" }]
         }
     ]
 });
diff --git a/tests/lib/rules/no-invalid-this.js b/tests/lib/rules/no-invalid-this.js
index 90cbdef98..6b54d9a96 100644
--- a/tests/lib/rules/no-invalid-this.js
+++ b/tests/lib/rules/no-invalid-this.js
@@ -865,6 +865,14 @@ const patterns = [
         valid: [NORMAL],
         invalid: [USE_STRICT, IMPLIED_STRICT, MODULES],
         errors: [{ messageId: "unexpectedThis", type: "ThisExpression" }]
+    },
+
+    // in es3, "use strict" directives do not apply
+    {
+        code: "function foo() { 'use strict'; this.eval(); }",
+        parserOptions: { ecmaVersion: 3 },
+        valid: [NORMAL, USE_STRICT, IMPLIED_STRICT],
+        invalid: []
     }
 ];