Repository: eslint/eslint
Pull request #11378 (2019-02-11 16:58:45)

Docs: Update README with latest sponsors/team data
<!--
    ESLint adheres to the [JS Foundation Code of Conduct](https://js.foundation/community/code-of-conduct).
-->

**What is the purpose of this pull request? (put an "X" next to item)**

[x] Documentation update
[ ] Bug fix ([template](https://raw.githubusercontent.com/eslint/eslint/master/templates/bug-report.md))
[ ] New rule ([template](https://raw.githubusercontent.com/eslint/eslint/master/templates/rule-proposal.md))
[ ] Changes an existing rule ([template](https://raw.githubusercontent.com/eslint/eslint/master/templates/rule-change-proposal.md))
[ ] Add autofixing to a rule
[ ] Add a CLI option
[ ] Add something to the core
[x] Other, please explain:

Add tool to update README.

<!--
    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)**

1. Created a script to pull the latest team data sponsor data from the website to incorporate into the README. The script assumes that the website folder is on the same level as the `eslint` folder (an assumption we already have built into existing scripts).
2. Eliminated "Alumni" section from the README (not very useful to have here, but we'll still have it on the eslint.org/team).
3. Added "Sponsors" section to the README.

Once this is merged, I can setup a Jenkins job to update automatically.

**Is there anything you'd like reviewers to focus on?**

Nothing in particular.




Patch:
diff --git a/README.md b/README.md
index e1855ec3f..847f5ac34 100644
--- a/README.md
+++ b/README.md
@@ -197,170 +197,80 @@ These folks keep the project moving and are resources for help.
 
 The people who manage releases, review feature requests, and meet regularly to ensure ESLint is properly maintained.
 
-<table>
-    <tbody>
-        <tr>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/nzakas">
-                <img src="https://github.com/nzakas.png?s=75" width="75px" height="75px"><br/>
-                <sub>Nicholas C. Zakas</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/ilyavolodin">
-                <img src="https://github.com/ilyavolodin.png?s=75" width="75px" height="75px"><br/>
-                <sub>Ilya Volodin</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/btmills">
-                <img src="https://github.com/btmills.png?s=75" width="75px" height="75px"><br/>
-                <sub>Brandon Mills</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/gyandeeps">
-                <img src="https://github.com/gyandeeps.png?s=75" width="75px" height="75px"><br/>
-                <sub>Gyandeep Singh</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a  href="https://github.com/mysticatea">
-                <img src="https://github.com/mysticatea.png?s=75" width="75px" height="75px"><br/>
-                <sub>Toru Nagashima</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/alberto">
-                <img src="https://github.com/alberto.png?s=75" width="75px" height="75px"><br/>
-                <sub>Alberto Rodríguez</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/kaicataldo">
-                <img src="https://github.com/kaicataldo.png?s=75" width="75px" height="75px"><br/>
-                <sub>Kai Cataldo</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/not-an-aardvark">
-                <img src="https://github.com/not-an-aardvark.png?s=75" width="75px" height="75px"><br/>
-                <sub>Teddy Katz</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/platinumazure">
-                <img src="https://github.com/platinumazure.png?s=75" width="75px" height="75px"><br/>
-                <sub>Kevin Partington</sub></a>
-            </td>
-        </tr>
-    </tbody>
-</table>
+<!-- NOTE: This section is autogenerated. Do not manually edit.-->
+<!--tscstart-->
+<table><tbody><tr><td align="center" valign="top" width="11%">
+<a href="https://github.com/nzakas">
+<img src="https://github.com/nzakas.png?s=75" width="75" height="75"><br />
+Nicholas C. Zakas
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/platinumazure">
+<img src="https://github.com/platinumazure.png?s=75" width="75" height="75"><br />
+Kevin Partington
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/ilyavolodin">
+<img src="https://github.com/ilyavolodin.png?s=75" width="75" height="75"><br />
+Ilya Volodin
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/btmills">
+<img src="https://github.com/btmills.png?s=75" width="75" height="75"><br />
+Brandon Mills
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/mysticatea">
+<img src="https://github.com/mysticatea.png?s=75" width="75" height="75"><br />
+Toru Nagashima
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/gyandeeps">
+<img src="https://github.com/gyandeeps.png?s=75" width="75" height="75"><br />
+Gyandeep Singh
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/kaicataldo">
+<img src="https://github.com/kaicataldo.png?s=75" width="75" height="75"><br />
+Kai Cataldo
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/not-an-aardvark">
+<img src="https://github.com/not-an-aardvark.png?s=75" width="75" height="75"><br />
+Teddy Katz
+</a>
+</td></tr></tbody></table><!--tscend-->
 
 ### Committers
 
 The people who review and fix bugs and help triage issues.
 
-<table>
-    <tbody>
-        <tr>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/Aladdin-ADD">
-                <img src="https://github.com/Aladdin-ADD.png?s=75" width="75px" height="75px"><br/>
-                <sub>薛定谔的猫</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/g-plane">
-                <img src="https://github.com/g-plane.png?s=75" width="75px" height="75px"><br/>
-                <sub>Pig Fang</sub></a>
-            </td>
-        </tr>
-    </tbody>
-</table>
-
-
-### Alumni
-
-Former TSC members and committers who previously helped maintain ESLint.
-
-<table>
-    <tbody>
-        <tr>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/lo1tuma">
-                <img src="https://github.com/lo1tuma.png?s=75" width="75px" height="75px"><br/>
-                <sub>Mathias Schreck</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/xjamundx">
-                <img src="https://github.com/xjamundx.png?s=75" width="75px" height="75px"><br/>
-                <sub>Jamund Ferguson</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/ianvs">
-                <img src="https://github.com/ianvs.png?s=75" width="75px" height="75px"><br/>
-                <sub>Ian VanSchooten</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/byk">
-                <img src="https://github.com/byk.png?s=75" width="75px" height="75px"><br/>
-                <sub>Burak Yiğit Kaya</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/michaelficarra">
-                <img src="https://github.com/michaelficarra.png?s=75" width="75px" height="75px"><br/>
-                <sub>Michael Ficarra</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/pedrottimark">
-                <img src="https://github.com/pedrottimark.png?s=75" width="75px" height="75px"><br/>
-                <sub>Mark Pedrotti</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/markelog">
-                <img src="https://github.com/markelog.png?s=75" width="75px" height="75px"><br/>
-                <sub>Oleg Gaidarenko</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/mikesherov">
-                <img src="https://github.com/mikesherov.png?s=75" width="75px" height="75px"><br/>
-                <sub>Mike Sherov</sub></a>
-            </td>
-        </tr>
-        <tr>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/hzoo">
-                <img src="https://github.com/hzoo.png?s=75" width="75px" height="75px"><br/>
-                <sub>Henry Zhu</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/mdevils">
-                <img src="https://github.com/mdevils.png?s=75" width="75px" height="75px"><br/>
-                <sub>Marat Dulin</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/zxqfox">
-                <img src="https://github.com/zxqfox.png?s=75" width="75px" height="75px"><br/>
-                <sub>Alexej Yaroshevich</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/vitorbal">
-                <img src="https://github.com/vitorbal.png?s=75" width="75px" height="75px"><br/>
-                <sub>Vitor Balocco</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/JamesHenry">
-                <img src="https://github.com/JamesHenry.png?s=75" width="75px" height="75px"><br/>
-                <sub>James Henry</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/soda0289">
-                <img src="https://github.com/soda0289.png?s=75" width="75px" height="75px"><br/>
-                <sub>Reyad Attiyat</sub></a>
-            </td>
-            <td align="center" valign="top" width="11%">
-                <a href="https://github.com/VictorHom">
-                <img src="https://github.com/VictorHom.png?s=75" width="75px" height="75px"><br/>
-                <sub>Victor Hom</sub></a>
-            </td>
-        </tr>
-    </tbody>
-</table>
+<!-- NOTE: This section is autogenerated. Do not manually edit.-->
+<!--committersstart-->
+<table><tbody><tr><td align="center" valign="top" width="11%">
+<a href="https://github.com/aladdin-add">
+<img src="https://github.com/aladdin-add.png?s=75" width="75" height="75"><br />
+薛定谔的猫
+</a>
+</td><td align="center" valign="top" width="11%">
+<a href="https://github.com/g-plane">
+<img src="https://github.com/g-plane.png?s=75" width="75" height="75"><br />
+Pig Fang
+</a>
+</td></tr></tbody></table><!--committersend-->
 
 ## Sponsors
 
+The following companies, organizations, and individuals support ESLint's ongoing maintenance and development. [Become a Sponsor](https://opencollective.com/eslint) to get your logo on our README and website.
+
+<!-- NOTE: This section is autogenerated. Do not manually edit.-->
+<!--sponsorsstart-->
+<h3>Gold Sponsors</h3>
+<p><a href="https://code.facebook.com/projects/"><img src="https://images.opencollective.com/proxy/images/?src=https%3A%2F%2Fres.cloudinary.com%2Fopencollective%2Fimage%2Fupload%2Fv1508519428%2FS9gk78AS_400x400_fulq2l.jpg&height=96" alt="Facebook Open Source" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/proxy/images/?src=https%3A%2F%2Fopencollective-production.s3-us-west-1.amazonaws.com%2F098e3bd0-4d57-11e8-9324-0f6cc1f92bf1.png&height=96" alt="Airbnb" height="96"></a></p>
+<!--sponsorsend-->
+
+## Technology Sponsors
+
 * Site search ([eslint.org](https://eslint.org)) is sponsored by [Algolia](https://www.algolia.com)
 
 
diff --git a/docs/developer-guide/working-with-custom-parsers.md b/docs/developer-guide/working-with-custom-parsers.md
index a7aa58f5e..d6626862d 100644
--- a/docs/developer-guide/working-with-custom-parsers.md
+++ b/docs/developer-guide/working-with-custom-parsers.md
@@ -9,7 +9,7 @@ If you want to use your own parser and provide additional capabilities for your
 * `visitorKeys` can be an object to customize AST traversal. The keys of the object are the type of AST nodes. Each value is an array of the property names which should be traversed. Default is [KEYS of `eslint-visitor-keys`](https://github.com/eslint/eslint-visitor-keys#evkkeys).
     * Support for `visitorKeys` was added in ESLint v4.14.0. ESLint versions which support `visitorKeys` will provide an `eslintVisitorKeys: true` property in `parserOptions`, which can be used for feature detection.
 
-You can find an ESLint parser project [here](https://github.com/typescript-eslint/typescript-eslint).
+You can find an ESLint parser project [here](https://github.com/eslint/typescript-eslint-parser).
 
 ```json
 {
diff --git a/docs/rules/prefer-spread.md b/docs/rules/prefer-spread.md
index 0011560c3..80893d74f 100644
--- a/docs/rules/prefer-spread.md
+++ b/docs/rules/prefer-spread.md
@@ -1,4 +1,4 @@
-# Suggest using spread syntax instead of `.apply()`. (prefer-spread)
+# Suggest using the spread operator instead of `.apply()`. (prefer-spread)
 
 Before ES2015, one must use `Function.prototype.apply()` to call variadic functions.
 
@@ -7,7 +7,7 @@ var args = [1, 2, 3, 4];
 Math.max.apply(Math, args);
 ```
 
-In ES2015, one can use spread syntax to call variadic functions.
+In ES2015, one can use the spread operator to call variadic functions.
 
 ```js
 /*eslint-env es6*/
@@ -18,7 +18,7 @@ Math.max(...args);
 
 ## Rule Details
 
-This rule is aimed to flag usage of `Function.prototype.apply()` in situations where spread syntax could be used instead.
+This rule is aimed to flag usage of `Function.prototype.apply()` in situations where the spread operator could be used instead.
 
 ## Examples
 
@@ -37,7 +37,7 @@ Examples of **correct** code for this rule:
 ```js
 /*eslint prefer-spread: "error"*/
 
-// Using spread syntax
+// Using the spread operator
 foo(...args);
 obj.foo(...args);
 
diff --git a/docs/user-guide/configuring.md b/docs/user-guide/configuring.md
index c2400a99c..1eed790a2 100644
--- a/docs/user-guide/configuring.md
+++ b/docs/user-guide/configuring.md
@@ -23,7 +23,7 @@ Please note that supporting JSX syntax is not the same as supporting React. Reac
 By the same token, supporting ES6 syntax is not the same as supporting new ES6 globals (e.g., new types such as
 `Set`).
 For ES6 syntax, use `{ "parserOptions": { "ecmaVersion": 6 } }`; for new ES6 global variables, use `{ "env":
-{ "es6": true } }`. `{ env: { es6: true } }` enables ES6 syntax automatically, but `{ parserOptions: { ecmaVersion: 6 } }` does not enable ES6 globals automatically.
+{ "es6": true } }` (this setting enables ES6 syntax automatically).
 Parser options are set in your `.eslintrc.*` file by using the `parserOptions` property. The available options are:
 
 * `ecmaVersion` - set to 3, 5 (default), 6, 7, 8, 9, or 10 to specify the version of ECMAScript syntax you want to use. You can also set to 2015 (same as 6), 2016 (same as 7), 2017 (same as 8), 2018 (same as 9), or 2019 (same as 10) to use the year-based naming.
@@ -81,7 +81,7 @@ The following parsers are compatible with ESLint:
 
 * [Esprima](https://www.npmjs.com/package/esprima)
 * [Babel-ESLint](https://www.npmjs.com/package/babel-eslint) - A wrapper around the [Babel](https://babeljs.io) parser that makes it compatible with ESLint.
-* [@typescript-eslint/parser](https://www.npmjs.com/package/@typescript-eslint/parser) - A parser that converts TypeScript into an ESTree-compatible form so it can be used in ESLint.
+* [typescript-eslint-parser(Experimental)](https://www.npmjs.com/package/typescript-eslint-parser) - A parser that converts TypeScript into an ESTree-compatible form so it can be used in ESLint. The goal is to allow TypeScript files to be parsed by ESLint (though not necessarily pass all ESLint rules).
 
 Note when using a custom parser, the `parserOptions` configuration property is still required for ESLint to work properly with features not in ECMAScript 5 by default. Parsers are all passed `parserOptions` and may or may not use them to determine which features to enable.
 
diff --git a/lib/rules/prefer-destructuring.js b/lib/rules/prefer-destructuring.js
index dec93d51f..119fae560 100644
--- a/lib/rules/prefer-destructuring.js
+++ b/lib/rules/prefer-destructuring.js
@@ -19,8 +19,6 @@ module.exports = {
             url: "https://eslint.org/docs/rules/prefer-destructuring"
         },
 
-        fixable: "code",
-
         schema: [
             {
 
@@ -132,55 +130,10 @@ module.exports = {
          *
          * @param {ASTNode} reportNode the node to report
          * @param {string} type the type of destructuring that should have been done
-         * @param {Function|null} fix the fix function or null to pass to context.report
          * @returns {void}
          */
-        function report(reportNode, type, fix) {
-            context.report({
-                node: reportNode,
-                message: "Use {{type}} destructuring.",
-                data: { type },
-                fix
-            });
-        }
-
-        /**
-         * Determines if a node should be fixed into object destructuring
-         *
-         * The fixer only fixes the simplest case of object destructuring,
-         * like: `let x = a.x`;
-         *
-         * Assignment expression is not fixed.
-         * Array destructuring is not fixed.
-         * Renamed property is not fixed.
-         *
-         * @param {ASTNode} node the the node to evaluate
-         * @returns {boolean} whether or not the node should be fixed
-         */
-        function shouldFix(node) {
-            return node.type === "VariableDeclarator" &&
-                node.id.type === "Identifier" &&
-                node.init.type === "MemberExpression" &&
-                node.id.name === node.init.property.name;
-        }
-
-        /**
-         * Fix a node into object destructuring.
-         * This function only handles the simplest case of object destructuring,
-         * see {@link shouldFix}.
-         *
-         * @param {SourceCodeFixer} fixer the fixer object
-         * @param {ASTNode} node the node to be fixed.
-         * @returns {Object} a fix for the node
-         */
-        function fixIntoObjectDestructuring(fixer, node) {
-            const rightNode = node.init;
-            const sourceCode = context.getSourceCode();
-
-            return fixer.replaceText(
-                node,
-                `{${rightNode.property.name}} = ${sourceCode.getText(rightNode.object)}`
-            );
+        function report(reportNode, type) {
+            context.report({ node: reportNode, message: "Use {{type}} destructuring.", data: { type } });
         }
 
         /**
@@ -202,17 +155,13 @@ module.exports = {
 
             if (isArrayIndexAccess(rightNode)) {
                 if (shouldCheck(reportNode.type, "array")) {
-                    report(reportNode, "array", null);
+                    report(reportNode, "array");
                 }
                 return;
             }
 
-            const fix = shouldFix(reportNode)
-                ? fixer => fixIntoObjectDestructuring(fixer, reportNode)
-                : null;
-
             if (shouldCheck(reportNode.type, "object") && enforceForRenamedProperties) {
-                report(reportNode, "object", fix);
+                report(reportNode, "object");
                 return;
             }
 
@@ -223,7 +172,7 @@ module.exports = {
                     (property.type === "Literal" && leftNode.name === property.value) ||
                     (property.type === "Identifier" && leftNode.name === property.name && !rightNode.computed)
                 ) {
-                    report(reportNode, "object", fix);
+                    report(reportNode, "object");
                 }
             }
         }
diff --git a/lib/rules/prefer-spread.js b/lib/rules/prefer-spread.js
index 5f3a47732..790fd3b82 100644
--- a/lib/rules/prefer-spread.js
+++ b/lib/rules/prefer-spread.js
@@ -59,7 +59,7 @@ module.exports = {
         },
 
         schema: [],
-        fixable: null
+        fixable: "code"
     },
 
     create(context) {
@@ -78,7 +78,18 @@ module.exports = {
                 if (isValidThisArg(expectedThis, thisArg, sourceCode)) {
                     context.report({
                         node,
-                        message: "Use the spread operator instead of '.apply()'."
+                        message: "Use the spread operator instead of '.apply()'.",
+                        fix(fixer) {
+                            if (expectedThis && expectedThis.type !== "Identifier") {
+
+                                // Don't fix cases where the `this` value could be a computed expression.
+                                return null;
+                            }
+
+                            const propertyDot = sourceCode.getFirstTokenBetween(applied, node.callee.property, token => token.value === ".");
+
+                            return fixer.replaceTextRange([propertyDot.range[0], node.range[1]], `(...${sourceCode.getText(node.arguments[1])})`);
+                        }
                     });
                 }
             }
diff --git a/package.json b/package.json
index f1776d804..ad2790622 100644
--- a/package.json
+++ b/package.json
@@ -82,6 +82,7 @@
     "browserify": "^16.2.2",
     "chai": "^4.0.1",
     "cheerio": "^0.22.0",
+    "common-tags": "^1.8.0",
     "coveralls": "^3.0.1",
     "dateformat": "^3.0.3",
     "ejs": "^2.6.1",
diff --git a/tools/update-readme.js b/tools/update-readme.js
new file mode 100644
index 000000000..9b0f96d76
--- /dev/null
+++ b/tools/update-readme.js
@@ -0,0 +1,96 @@
+/**
+ * @fileoverview Script to update the README with team and sponsors.
+ * Note that this requires eslint.github.io to be available in the same
+ * directory as the eslint repo.
+ *
+ *   node tools/update-readme.js
+ *
+ * @author Nicholas C. Zakas
+ */
+"use strict";
+
+//-----------------------------------------------------------------------------
+// Requirements
+//-----------------------------------------------------------------------------
+
+const path = require("path");
+const fs = require("fs");
+const { stripIndents } = require("common-tags");
+
+//-----------------------------------------------------------------------------
+// Data
+//-----------------------------------------------------------------------------
+
+const README_FILE_PATH = path.resolve(__dirname, "../README.md");
+const WEBSITE_DATA_PATH = path.resolve(__dirname, "../../eslint.github.io/_data");
+
+const team = JSON.parse(fs.readFileSync(path.join(WEBSITE_DATA_PATH, "team.json")));
+const allSponsors = JSON.parse(fs.readFileSync(path.join(WEBSITE_DATA_PATH, "sponsors.json")));
+const readme = fs.readFileSync(README_FILE_PATH, "utf8");
+
+const heights = {
+    gold: 96,
+    silver: 64,
+    bronze: 32
+};
+
+// remove backers from sponsors list - not shown on readme
+delete allSponsors.backers;
+
+
+//-----------------------------------------------------------------------------
+// Helpers
+//-----------------------------------------------------------------------------
+
+/**
+ * Formats an array of team members for inclusion in the readme.
+ * @param {Array} members The array of members to format.
+ * @param {string} label The label for the section of the readme.
+ * @returns {string} The HTML for the members list.
+ */
+function formatTeamMembers(members, label) {
+    /* eslint-disable indent*/
+    return stripIndents`<!--${label}start-->
+        <table><tbody><tr>${
+        members.map((member, index) => `<td align="center" valign="top" width="11%">
+            <a href="https://github.com/${member.username}">
+                <img src="https://github.com/${member.username}.png?s=75" width="75" height="75"><br />
+                ${member.name}
+            </a>
+            </td>${(index + 1) % 9 === 0 ? "</tr><tr>" : ""}`).join("")
+        }</tr></tbody></table><!--${label}end-->`;
+    /* eslint-enable indent*/
+}
+
+/**
+ * Formats an array of sponsors into HTML for the readme.
+ * @param {Array} sponsors The array of sponsors.
+ * @returns {string} The HTML for the readme.
+ */
+function formatSponsors(sponsors) {
+    const nonEmptySponsors = Object.keys(sponsors).filter(tier => sponsors[tier].length > 0);
+
+    /* eslint-disable indent*/
+    return stripIndents`<!--sponsorsstart-->
+        ${
+            nonEmptySponsors.map(tier => `<h3>${tier[0].toUpperCase()}${tier.slice(1)} Sponsors</h3>
+            <p>${
+                sponsors[tier].map(sponsor => `<a href="${sponsor.url}"><img src="${sponsor.image}" alt="${sponsor.name}" height="${heights[tier]}"></a>`).join(" ")
+            }</p>`).join("")
+        }
+    <!--sponsorsend-->`;
+    /* eslint-enable indent*/
+}
+
+//-----------------------------------------------------------------------------
+// Main
+//-----------------------------------------------------------------------------
+
+// replace all of the section
+let newReadme = readme.replace(/<!--tscstart-->[\w\W]*?<!--tscend-->/, formatTeamMembers(team.tsc, "tsc"));
+
+newReadme = newReadme.replace(/<!--committersstart-->[\w\W]*?<!--committersend-->/, formatTeamMembers(team.committers, "committers"));
+newReadme = newReadme.replace(/<!--sponsorsstart-->[\w\W]*?<!--sponsorsend-->/, formatSponsors(allSponsors));
+
+// output to the file
+fs.writeFileSync(README_FILE_PATH, newReadme, "utf8");


Test patch:
diff --git a/tests/lib/rules/prefer-destructuring.js b/tests/lib/rules/prefer-destructuring.js
index 5470079ef..a0e4aa79b 100644
--- a/tests/lib/rules/prefer-destructuring.js
+++ b/tests/lib/rules/prefer-destructuring.js
@@ -133,21 +133,12 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         "class Foo extends Bar { static foo() {var foo = super.foo} }",
         "foo = bar[foo];",
-        "var foo = bar[foo];",
-        {
-            code: "var {foo: {bar}} = object;",
-            options: [{ object: true }]
-        },
-        {
-            code: "var {bar} = object.foo;",
-            options: [{ object: true }]
-        }
+        "var foo = bar[foo];"
     ],
 
     invalid: [
         {
             code: "var foo = array[0];",
-            output: null,
             errors: [{
                 message: "Use array destructuring.",
                 type: "VariableDeclarator"
@@ -155,7 +146,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = array[0];",
-            output: null,
             errors: [{
                 message: "Use array destructuring.",
                 type: "AssignmentExpression"
@@ -163,15 +153,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = object.foo;",
-            output: "var {foo} = object;",
-            errors: [{
-                message: "Use object destructuring.",
-                type: "VariableDeclarator"
-            }]
-        },
-        {
-            code: "var foo = object.bar.foo;",
-            output: "var {foo} = object.bar;",
             errors: [{
                 message: "Use object destructuring.",
                 type: "VariableDeclarator"
@@ -179,7 +160,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foobar = object.bar;",
-            output: null,
             options: [{ VariableDeclarator: { object: true } }, { enforceForRenamedProperties: true }],
             errors: [{
                 message: "Use object destructuring.",
@@ -188,7 +168,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foobar = object.bar;",
-            output: null,
             options: [{ object: true }, { enforceForRenamedProperties: true }],
             errors: [{
                 message: "Use object destructuring.",
@@ -197,7 +176,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = object[bar];",
-            output: null,
             options: [{ VariableDeclarator: { object: true } }, { enforceForRenamedProperties: true }],
             errors: [{
                 message: "Use object destructuring.",
@@ -206,7 +184,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = object[bar];",
-            output: null,
             options: [{ object: true }, { enforceForRenamedProperties: true }],
             errors: [{
                 message: "Use object destructuring.",
@@ -215,7 +192,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = object['foo'];",
-            output: null,
             errors: [{
                 message: "Use object destructuring.",
                 type: "VariableDeclarator"
@@ -223,7 +199,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = object.foo;",
-            output: null,
             errors: [{
                 message: "Use object destructuring.",
                 type: "AssignmentExpression"
@@ -231,7 +206,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = object['foo'];",
-            output: null,
             errors: [{
                 message: "Use object destructuring.",
                 type: "AssignmentExpression"
@@ -239,7 +213,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = array[0];",
-            output: null,
             options: [{ VariableDeclarator: { array: true } }, { enforceForRenamedProperties: true }],
             errors: [{
                 message: "Use array destructuring.",
@@ -248,7 +221,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = array[0];",
-            output: null,
             options: [{ AssignmentExpression: { array: true } }],
             errors: [{
                 message: "Use array destructuring.",
@@ -257,7 +229,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = array[0];",
-            output: null,
             options: [
                 {
                     VariableDeclarator: { array: true },
@@ -272,7 +243,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "var foo = array[0];",
-            output: null,
             options: [
                 {
                     VariableDeclarator: { array: true },
@@ -286,7 +256,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = array[0];",
-            output: null,
             options: [
                 {
                     VariableDeclarator: { array: false },
@@ -300,7 +269,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "foo = object.foo;",
-            output: null,
             options: [
                 {
                     VariableDeclarator: { array: true, object: false },
@@ -314,7 +282,6 @@ ruleTester.run("prefer-destructuring", rule, {
         },
         {
             code: "class Foo extends Bar { static foo() {var bar = super.foo.bar} }",
-            output: "class Foo extends Bar { static foo() {var {bar} = super.foo} }",
             errors: [{
                 message: "Use object destructuring.",
                 type: "VariableDeclarator"
diff --git a/tests/lib/rules/prefer-spread.js b/tests/lib/rules/prefer-spread.js
index 1e11dd6c4..7e9681770 100644
--- a/tests/lib/rules/prefer-spread.js
+++ b/tests/lib/rules/prefer-spread.js
@@ -44,34 +44,50 @@ ruleTester.run("prefer-spread", rule, {
     invalid: [
         {
             code: "foo.apply(undefined, args);",
+            output: "foo(...args);",
             errors
         },
         {
             code: "foo.apply(void 0, args);",
+            output: "foo(...args);",
             errors
         },
         {
             code: "foo.apply(null, args);",
+            output: "foo(...args);",
             errors
         },
         {
             code: "obj.foo.apply(obj, args);",
+            output: "obj.foo(...args);",
             errors
         },
         {
+
+            // Not fixed: a.b.c might activate getters
             code: "a.b.c.foo.apply(a.b.c, args);",
+            output: null,
             errors
         },
         {
+
+            // Not fixed: a.b(x, y).c might activate getters
             code: "a.b(x, y).c.foo.apply(a.b(x, y).c, args);",
+            output: null,
             errors
         },
         {
+
+            // Not fixed (not an identifier)
             code: "[].concat.apply([ ], args);",
+            output: null,
             errors
         },
         {
+
+            // Not fixed (not an identifier)
             code: "[].concat.apply([\n/*empty*/\n], args);",
+            output: null,
             errors
         }
     ]