Repository: eslint/eslint
Pull request #9788 (2017-12-28 21:56:18)

Docs: add url to each of the rules (refs #6582)
Automatically generated with this code mod:

```js
export default function transformer(file, api) {
    const j = api.jscodeshift;

    const name = file.path.split('/').pop().replace(/.js$/, '');

    return j(file.source)
      .find(j.ObjectExpression)
      .filter(path => path.parentPath.node.key && path.parentPath.node.key.name === 'docs')
      .forEach(path => {
        const prop = j.property('init', j.identifier('url'), j.literal(`https://eslint.org/docs/rules/${name}`));
        j(path).replaceWith(j.objectExpression([...path.node.properties, prop]));
      })
      .toSource({lineTerminator: '\n'});
  }
```


<!--
    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
[ ] 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)**
Added a `meta.docs.url` property to each of the built in rules.

**Is there anything you'd like reviewers to focus on?**
I had to manually update `no-extra-parens` and `no-unused-vars` because jscodeshift made unwanted changes to those files. 

If you want to critique my script, I'm open to that too. I don't have much experience with codemods. It might not be a bad idea to clean up the script and publish it so that it can be used by plugin authors.  


ilyavolodin: Thanks for doing this. I wonder if we should preserve jscodeshift code in https://github.com/eslint/eslint-transforms so that plugin authors could take advantage of that?
not-an-aardvark: Personally, I think it would be better to have the property added dynamically to the rules objects for core rules so that we don't have to duplicate it in every file. This would avoid any issues where e.g. someone forgets to add the property to a new rule.
platinumazure: @not-an-aardvark

> Personally, I think it would be better to have the property added dynamically to the rules objects for core rules so that we don't have to duplicate it in every file. This would avoid any issues where e.g. someone forgets to add the property to a new rule.

You're not wrong, but we could also add an internal linting rule for that purpose.
not-an-aardvark: Sure, a linting rule is a good way to prevent bugs in those lines of code, but a better way to prevent bugs like that is to not have those lines of code at all. It's easy to generate the URL for any given rule at runtime, so a codemod seems like the wrong way to do this.
j-f1: From https://github.com/eslint/eslint/pull/9782#issuecomment-354324043, related to the above discussion:

> Would it be possible to add a method on the exported plugin object that generates the docs URL so that people can optionally DRY out their code? (i.e. ``getDocsURL: name => `https://github.com/foo/eslint-plugin-bar/blob/master/docs/rules/${name}.md` `` instead of providing `meta.docs.url` on each rule)
pmcelhaney: I wrote an internal listing rule last night. Should I add it to this PR or create a separate one?
pmcelhaney: My original thought was to create a method at the plugin level, but it went against the philosophy that each rule is independent. 

I’ve come around to that line of thinking. There’s a certain amount of boilerplate that we can never completely DRY out. 

There’s a one time retrofit which the codemod makes almost effortless. From then, the only time one needs to think about the URL is right after writing the docs, which is several orders of magnitude more effort. 
not-an-aardvark: > There’s a certain amount of boilerplate that we can never completely DRY out.

As far as core rules are concerned, it seems like this would be a fairly simple refactoring. I agree that exposing it as a convenience for plugins would be more complicated and maybe not worthwhile. (When writing a plugin, I would probably dynamically generate the URLs for the exported rule objects.)

I'm fine with this being merged as-is, but I think switching to dynamically generate the URLs for core rules would be a good change if someone has time for it in the future.

Patch:
diff --git a/docs/developer-guide/nodejs-api.md b/docs/developer-guide/nodejs-api.md
index d2f9ae91c..b72425262 100644
--- a/docs/developer-guide/nodejs-api.md
+++ b/docs/developer-guide/nodejs-api.md
@@ -4,6 +4,35 @@ While ESLint is designed to be run on the command line, it's possible to use ESL
 
 **Note:** Use undocumented parts of the API at your own risk. Only those parts that are specifically mentioned in this document are approved for use and will remain stable and reliable. Anything left undocumented is unstable and may change or be removed at any point.
 
+## Table of Contents
+
+* [SourceCode](#sourcecode)
+    * [splitLines()](#sourcecodesplitlines)
+* [Linter](#linter)
+    * [verify()](#linterverify)
+    * [verifyAndFix()](#linterverifyandfix)
+    * [defineRule()](#linterdefinerule)
+    * [defineRules()](#linterdefinerules)
+    * [getRules()](#lintergetrules)
+    * [defineParser()](#linterdefineparser)
+    * [version](#linterversion)
+* [linter (deprecated)](#linter-1)
+* [CLIEngine](#cliengine)
+    * [executeOnFiles()](#cliengineexecuteonfiles)
+    * [resolveFileGlobPatterns()](#cliengineresolvefileglobpatterns)
+    * [getConfigForFile()](#clienginegetconfigforfile)
+    * [executeOnText()](#cliengineexecuteontext)
+    * [addPlugin()](#cliengineaddplugin)
+    * [isPathIgnored()](#cliengineispathignored)
+    * [getFormatter()](#clienginegetformatter)
+    * [getErrorResults()](#clienginegeterrorresults)
+    * [outputFixes()](#cliengineoutputfixes)
+    * [getRules()](#clienginegetrules)
+    * [version](#cliengineversion)
+* [RuleTester](#ruletester)
+    * [Customizing RuleTester](#customizing-ruletester)
+* [Deprecated APIs](#deprecated-apis)
+
 ## SourceCode
 
 The `SourceCode` type represents the parsed source code that ESLint executes on. It's used internally in ESLint and is also available so that already-parsed code can be used. You can create a new instance of `SourceCode` by passing in the text string representing the code and an abstract syntax tree (AST) in [ESTree](https://github.com/estree/estree) format (including location information, range information, comments, and tokens):
@@ -28,7 +57,7 @@ assert(code.hasBOM === true);
 assert(code.text === "var foo = bar;");
 ```
 
-### splitLines()
+### SourceCode#splitLines()
 
 This is a static function on `SourceCode` that is used to split the source code text into an array of lines.
 
@@ -64,7 +93,7 @@ The most important method on `Linter` is `verify()`, which initiates linting of
 
 * `code` - the source code to lint (a string or instance of `SourceCode`).
 * `config` - a configuration object that has been processed and normalized by CLIEngine using eslintrc files and/or other configuration arguments.
-    * **Note**: If you want to lint text and have your configuration be read and processed, use CLIEngine's [`executeOnFiles`](#executeonfiles) or [`executeOnText`](#executeontext) instead.
+    * **Note**: If you want to lint text and have your configuration be read and processed, use CLIEngine's [`executeOnFiles`](#cliengineexecuteonfiles) or [`executeOnText`](#cliengineexecuteontext) instead.
 * `options` - (optional) Additional options for this run.
     * `filename` - (optional) the filename to associate with the source code.
     * `preprocess` - (optional) A function that accepts a string containing source text, and returns an array of strings containing blocks of code to lint. Also see: [Processors in Plugins](/docs/developer-guide/working-with-plugins.md#processors-in-plugins)
@@ -244,7 +273,7 @@ Map {
 ### Linter#defineParser
 
 Each instance of `Linter` holds a map of custom parsers. If you want to define a parser programmatically you can add this function
-with the name of the parser as first argument and the [parser object](/docs/developer-guide/working-with-plugins#working-with-custom-parsers) as second argument.
+with the name of the parser as first argument and the [parser object](/docs/developer-guide/working-with-plugins.md#working-with-custom-parsers) as second argument.
 
 If during linting the parser is not found, it will fallback to `require(parserId)`.
 
@@ -274,7 +303,7 @@ linter.version; // => '4.5.0'
 
 ## linter
 
-The `eslint.linter` object (deprecated) is an instance of the `Linter` class as defined [above](#Linter). `eslint.linter` exists for backwards compatibility, but we do not recommend using it because any mutations to it are shared among every module that uses `eslint`. Instead, please create your own instance of `eslint.Linter`.
+The `eslint.linter` object (deprecated) is an instance of the `Linter` class as defined [above](#linter). `eslint.linter` exists for backwards compatibility, but we do not recommend using it because any mutations to it are shared among every module that uses `eslint`. Instead, please create your own instance of `eslint.Linter`.
 
 ```js
 var linter = require("eslint").linter;
@@ -309,7 +338,7 @@ The `CLIEngine` is a constructor, and you can create a new instance by passing i
 * `cwd` - Path to a directory that should be considered as the current working directory.
 * `envs` - An array of environments to load (default: empty array). Corresponds to `--env`.
 * `extensions` - An array of filename extensions that should be checked for code. The default is an array containing just `".js"`. Corresponds to `--ext`. It is only used in conjunction with directories, not with filenames or glob patterns.
-* `fix` - This can be a boolean or a function which will be provided each linting message and should return a boolean. True indicates that fixes should be included with the output report, and that errors and warnings should not be listed if they can be fixed. However, the files on disk will not be changed. To persist changes to disk, call [`outputFixes()`](#outputfixes).
+* `fix` - This can be a boolean or a function which will be provided each linting message and should return a boolean. True indicates that fixes should be included with the output report, and that errors and warnings should not be listed if they can be fixed. However, the files on disk will not be changed. To persist changes to disk, call [`outputFixes()`](#cliengineoutputfixes).
 * `globals` - An array of global variables to declare (default: empty array). Corresponds to `--global`.
 * `ignore` - False disables use of `.eslintignore`, `ignorePath` and `ignorePattern` (default: true). Corresponds to `--no-ignore`.
 * `ignorePath` - The ignore file to use instead of `.eslintignore` (default: null). Corresponds to `--ignore-path`.
@@ -340,7 +369,7 @@ var cli = new CLIEngine({
 
 In this code, a new `CLIEngine` instance is created that sets two environments, `"browser"` and `"mocha"`, disables loading of `.eslintrc` and `package.json` files, and enables the `semi` rule as an error. You can then call methods on `cli` and these options will be used to perform the correct action.
 
-### executeOnFiles()
+### CLIEngine#executeOnFiles()
 
 If you want to lint one or more files, use the `executeOnFiles()` method. This method accepts a single argument, which is an array of files and/or directories to traverse for files. You can pass the same values as you would using the ESLint command line interface, such as `"."` to search all JavaScript files in the current directory. Here's an example:
 
@@ -489,9 +518,9 @@ The top-level report object also has `errorCount` and `warningCount` which give
 
 Report message objects have a deprecated `source` property. This property **will be removed** from the linting messages returned in `messages` in an upcoming breaking release. If you depend on this property, you should now use the top-level `source` or `output` properties instead.
 
-Once you get a report object, it's up to you to determine how to output the results. Fixes will not be automatically applied to the files, even if you set `fix: true` when constructing the `CLIEngine` instance. To apply fixes to the files, call [`outputFixes`](#outputfixes).
+Once you get a report object, it's up to you to determine how to output the results. Fixes will not be automatically applied to the files, even if you set `fix: true` when constructing the `CLIEngine` instance. To apply fixes to the files, call [`outputFixes`](#cliengineoutputfixes).
 
-### resolveFileGlobPatterns()
+### CLIEngine#resolveFileGlobPatterns()
 
 You can pass filesystem-style or glob patterns to ESLint and have it function properly. In order to achieve this, ESLint must resolve non-glob patterns into glob patterns before determining which files to execute on. The `resolveFileGlobPatterns()` methods uses the current settings from `CLIEngine` to resolve non-glob patterns into glob patterns. Pass an array of patterns that might be passed to the ESLint CLI and it will return an array of glob patterns that mean the same thing. Here's an example:
 
@@ -506,7 +535,7 @@ var globPatterns = cli.resolveFileGlobPatterns(["."]);
 console.log(globPatterns[i]);       // ["**/*.js"]
 ```
 
-### getConfigForFile()
+### CLIEngine#getConfigForFile()
 
 If you want to retrieve a configuration object for a given file, use the `getConfigForFile()` method. This method accepts one argument, a file path, and returns an object represented the calculated configuration of the file. Here's an example:
 
@@ -543,7 +572,7 @@ var config = cli.getConfigForFile("myfile.js");
 var messages = linter.verify('var foo;', config);
 ```
 
-### executeOnText()
+### CLIEngine#executeOnText()
 
 If you already have some text to lint, then you can use the `executeOnText()` method to lint that text. The linter will assume that the text is a file in the current working directory, and so will still obey any `.eslintrc` and `.eslintignore` files that may be present. Here's an example:
 
@@ -567,7 +596,7 @@ The `report` returned from `executeOnText()` is in the same format as from `exec
 
 If a filename in the optional second parameter matches a file that is configured to be ignored, then this function returns no errors or warnings. To return a warning instead, call the method with true as the optional third parameter.
 
-### addPlugin()
+### CLIEngine#addPlugin()
 
 Loads a plugin from configuration object with specified name. Name can include plugin prefix ("eslint-plugin-")
 
@@ -590,7 +619,7 @@ cli.addPlugin("eslint-plugin-processor", {
 });
 ```
 
-### isPathIgnored()
+### CLIEngine#isPathIgnored()
 
 Checks if a given path is ignored by ESLint.
 
@@ -605,7 +634,7 @@ var cli = new CLIEngine({
 var isIgnored = cli.isPathIgnored("foo/bar.js");
 ```
 
-### getFormatter()
+### CLIEngine#getFormatter()
 
 Retrieves a formatter, which you can then use to format a report object. The argument is either the name of a built-in formatter:
 
@@ -657,7 +686,7 @@ var formatter = CLIEngine.getFormatter();
 
 **Important:** You must pass in the `results` property of the report. Passing in `report` directly will result in an error.
 
-### getErrorResults()
+### CLIEngine#getErrorResults()
 
 This is a static function on `CLIEngine`. It can be used to filter out all the non error messages from the report object.
 
@@ -681,7 +710,7 @@ var errorReport = CLIEngine.getErrorResults(report.results)
 
 **Important:** You must pass in the `results` property of the report. Passing in `report` directly will result in an error.
 
-### outputFixes()
+### CLIEngine#outputFixes()
 
 This is a static function on `CLIEngine` that is used to output fixes from `report` to disk. It does by looking for files that have an `output` property in their results. Here's an example:
 
@@ -704,6 +733,26 @@ var report = cli.executeOnFiles(["myfile.js", "lib/"]);
 CLIEngine.outputFixes(report);
 ```
 
+### CLIEngine#getRules()
+
+This method returns a map of all loaded rules. Under the hood, it calls [Linter#getRules](#lintergetrules).
+
+```js
+const CLIEngine = require("eslint").CLIEngine;
+const cli = new CLIEngine();
+
+cli.getRules();
+
+/*
+Map {
+  'accessor-pairs' => { meta: { docs: [Object], schema: [Array] }, create: [Function: create] },
+  'array-bracket-newline' => { meta: { docs: [Object], schema: [Array] }, create: [Function: create] },
+  ...
+}
+*/
+```
+
+
 ### CLIEngine.version
 
 `CLIEngine` has a static `version` property containing the semantic version number of ESLint that it comes from.
diff --git a/docs/rules/no-extra-parens.md b/docs/rules/no-extra-parens.md
index 392ac06a7..61fb50dc3 100644
--- a/docs/rules/no-extra-parens.md
+++ b/docs/rules/no-extra-parens.md
@@ -36,6 +36,12 @@ a = (b * c);
 
 (a * b) + c;
 
+for (a in (b, c));
+
+for (a in (b));
+
+for (a of (b));
+
 typeof (a);
 
 (function(){} ? a() : b());
@@ -55,6 +61,14 @@ Examples of **correct** code for this rule with the default `"all"` option:
 (function(){}) ? a() : b();
 
 (/^a$/).test(x);
+
+for (a of (b, c));
+
+for (a of b);
+
+for (a in b, c);
+
+for (a in b);
 ```
 
 ### conditionalAssign
diff --git a/docs/rules/sort-imports.md b/docs/rules/sort-imports.md
index 6c25922a6..d37527938 100644
--- a/docs/rules/sort-imports.md
+++ b/docs/rules/sort-imports.md
@@ -186,13 +186,12 @@ import * as b from 'bar.js';
 
 Examples of **correct** code for this rule with the `{ "memberSyntaxSortOrder": ['all', 'single', 'multiple', 'none'] }` option:
 
-```
+```js
 /*eslint sort-imports: ["error", { "memberSyntaxSortOrder": ['all', 'single', 'multiple', 'none'] }]*/
 
 import * as foo from 'foo.js';
 import z from 'zoo.js';
 import {a, b} from 'foo.js';
-
 ```
 
 Default is `["none", "all", "multiple", "single"]`.
diff --git a/lib/cli-engine.js b/lib/cli-engine.js
index 55450fd63..0c1afcbce 100644
--- a/lib/cli-engine.js
+++ b/lib/cli-engine.js
@@ -420,6 +420,10 @@ class CLIEngine {
         this.config = new Config(this.options, this.linter);
     }
 
+    getRules() {
+        return this.linter.getRules();
+    }
+
     /**
      * Returns results that only contains errors.
      * @param {LintResult[]} results The results to filter.
diff --git a/lib/rules/.eslintrc.yml b/lib/rules/.eslintrc.yml
index 2a8d90793..64b3cee7f 100644
--- a/lib/rules/.eslintrc.yml
+++ b/lib/rules/.eslintrc.yml
@@ -1,3 +1,4 @@
 rules:
     rulesdir/no-invalid-meta: "error"
     rulesdir/consistent-docs-description: "error"
+    rulesdir/consistent-docs-url: "error"
diff --git a/lib/rules/accessor-pairs.js b/lib/rules/accessor-pairs.js
index 4afdc7136..b01b29b17 100644
--- a/lib/rules/accessor-pairs.js
+++ b/lib/rules/accessor-pairs.js
@@ -75,7 +75,8 @@ module.exports = {
         docs: {
             description: "enforce getter and setter pairs in objects",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/accessor-pairs"
         },
         schema: [{
             type: "object",
diff --git a/lib/rules/array-bracket-newline.js b/lib/rules/array-bracket-newline.js
index cb7350a82..b939d65b3 100644
--- a/lib/rules/array-bracket-newline.js
+++ b/lib/rules/array-bracket-newline.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce linebreaks after opening and before closing array brackets",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/array-bracket-newline"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/array-bracket-spacing.js b/lib/rules/array-bracket-spacing.js
index aecef2c4f..933458a42 100644
--- a/lib/rules/array-bracket-spacing.js
+++ b/lib/rules/array-bracket-spacing.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing inside array brackets",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/array-bracket-spacing"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/array-callback-return.js b/lib/rules/array-callback-return.js
index 27d9c5680..69655481d 100644
--- a/lib/rules/array-callback-return.js
+++ b/lib/rules/array-callback-return.js
@@ -142,7 +142,8 @@ module.exports = {
         docs: {
             description: "enforce `return` statements in callbacks of array methods",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/array-callback-return"
         },
 
         schema: [
diff --git a/lib/rules/array-element-newline.js b/lib/rules/array-element-newline.js
index 26dc9bfa0..22352c7e3 100644
--- a/lib/rules/array-element-newline.js
+++ b/lib/rules/array-element-newline.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce line breaks after each array element",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/array-element-newline"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/arrow-body-style.js b/lib/rules/arrow-body-style.js
index 54e4e8d00..afbf46fd5 100644
--- a/lib/rules/arrow-body-style.js
+++ b/lib/rules/arrow-body-style.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "require braces around arrow function bodies",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/arrow-body-style"
         },
 
         schema: {
diff --git a/lib/rules/arrow-parens.js b/lib/rules/arrow-parens.js
index e8f8ddd8e..5a0fd61b3 100644
--- a/lib/rules/arrow-parens.js
+++ b/lib/rules/arrow-parens.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "require parentheses around arrow function arguments",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/arrow-parens"
         },
 
         fixable: "code",
diff --git a/lib/rules/arrow-spacing.js b/lib/rules/arrow-spacing.js
index 37e03907c..d2c5b9b77 100644
--- a/lib/rules/arrow-spacing.js
+++ b/lib/rules/arrow-spacing.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before and after the arrow in arrow functions",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/arrow-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/block-scoped-var.js b/lib/rules/block-scoped-var.js
index 0b4d855fa..58cef1741 100644
--- a/lib/rules/block-scoped-var.js
+++ b/lib/rules/block-scoped-var.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "enforce the use of variables within the scope they are defined",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/block-scoped-var"
         },
 
         schema: []
diff --git a/lib/rules/block-spacing.js b/lib/rules/block-spacing.js
index b3ea8405e..4fbf6d4c0 100644
--- a/lib/rules/block-spacing.js
+++ b/lib/rules/block-spacing.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow or enforce spaces inside of blocks after opening block and before closing block",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/block-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/brace-style.js b/lib/rules/brace-style.js
index 320da9dac..bc0ddbd78 100644
--- a/lib/rules/brace-style.js
+++ b/lib/rules/brace-style.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce consistent brace style for blocks",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/brace-style"
         },
 
         schema: [
diff --git a/lib/rules/callback-return.js b/lib/rules/callback-return.js
index 0fa7f278a..ed85c7181 100644
--- a/lib/rules/callback-return.js
+++ b/lib/rules/callback-return.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "require `return` statements after callbacks",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/callback-return"
         },
 
         schema: [{
diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js
index e3b764f7c..86822f975 100644
--- a/lib/rules/camelcase.js
+++ b/lib/rules/camelcase.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce camelcase naming convention",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/camelcase"
         },
 
         schema: [
diff --git a/lib/rules/capitalized-comments.js b/lib/rules/capitalized-comments.js
index 1a2760806..19b5f6a71 100644
--- a/lib/rules/capitalized-comments.js
+++ b/lib/rules/capitalized-comments.js
@@ -113,7 +113,8 @@ module.exports = {
         docs: {
             description: "enforce or disallow capitalization of the first letter of a comment",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/capitalized-comments"
         },
         fixable: "code",
         schema: [
diff --git a/lib/rules/class-methods-use-this.js b/lib/rules/class-methods-use-this.js
index d429c579b..774086780 100644
--- a/lib/rules/class-methods-use-this.js
+++ b/lib/rules/class-methods-use-this.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce that class methods utilize `this`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/class-methods-use-this"
         },
         schema: [{
             type: "object",
diff --git a/lib/rules/comma-dangle.js b/lib/rules/comma-dangle.js
index ddcc0cd22..180979d40 100644
--- a/lib/rules/comma-dangle.js
+++ b/lib/rules/comma-dangle.js
@@ -79,7 +79,8 @@ module.exports = {
         docs: {
             description: "require or disallow trailing commas",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/comma-dangle"
         },
         fixable: "code",
         schema: {
diff --git a/lib/rules/comma-spacing.js b/lib/rules/comma-spacing.js
index 25a0e7d82..dd3de7f35 100644
--- a/lib/rules/comma-spacing.js
+++ b/lib/rules/comma-spacing.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before and after commas",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/comma-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/comma-style.js b/lib/rules/comma-style.js
index 4c65338a4..8b96e5e25 100644
--- a/lib/rules/comma-style.js
+++ b/lib/rules/comma-style.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce consistent comma style",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/comma-style"
         },
         fixable: "code",
         schema: [
diff --git a/lib/rules/complexity.js b/lib/rules/complexity.js
index 323fdbff8..1838d4bf8 100644
--- a/lib/rules/complexity.js
+++ b/lib/rules/complexity.js
@@ -23,7 +23,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum cyclomatic complexity allowed in a program",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/complexity"
         },
 
         schema: [
diff --git a/lib/rules/computed-property-spacing.js b/lib/rules/computed-property-spacing.js
index 19c28fd22..57408afb4 100644
--- a/lib/rules/computed-property-spacing.js
+++ b/lib/rules/computed-property-spacing.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing inside computed property brackets",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/computed-property-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/consistent-return.js b/lib/rules/consistent-return.js
index a42faaa1e..a436dd1fc 100644
--- a/lib/rules/consistent-return.js
+++ b/lib/rules/consistent-return.js
@@ -56,7 +56,8 @@ module.exports = {
         docs: {
             description: "require `return` statements to either always or never specify values",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/consistent-return"
         },
 
         schema: [{
diff --git a/lib/rules/consistent-this.js b/lib/rules/consistent-this.js
index 151cdcf9c..60690007f 100644
--- a/lib/rules/consistent-this.js
+++ b/lib/rules/consistent-this.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "enforce consistent naming when capturing the current execution context",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/consistent-this"
         },
 
         schema: {
diff --git a/lib/rules/constructor-super.js b/lib/rules/constructor-super.js
index d0a238df8..30637472f 100644
--- a/lib/rules/constructor-super.js
+++ b/lib/rules/constructor-super.js
@@ -95,7 +95,8 @@ module.exports = {
         docs: {
             description: "require `super()` calls in constructors",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/constructor-super"
         },
 
         schema: []
diff --git a/lib/rules/curly.js b/lib/rules/curly.js
index 37f07d95e..7fdf57eda 100644
--- a/lib/rules/curly.js
+++ b/lib/rules/curly.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce consistent brace style for all control statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/curly"
         },
 
         schema: {
diff --git a/lib/rules/default-case.js b/lib/rules/default-case.js
index 32cd8dfe4..a66300a99 100644
--- a/lib/rules/default-case.js
+++ b/lib/rules/default-case.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "require `default` cases in `switch` statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/default-case"
         },
 
         schema: [{
diff --git a/lib/rules/dot-location.js b/lib/rules/dot-location.js
index 60f4af701..c02476e03 100644
--- a/lib/rules/dot-location.js
+++ b/lib/rules/dot-location.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce consistent newlines before and after dots",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/dot-location"
         },
 
         schema: [
diff --git a/lib/rules/dot-notation.js b/lib/rules/dot-notation.js
index 21e3df174..10c73b41f 100644
--- a/lib/rules/dot-notation.js
+++ b/lib/rules/dot-notation.js
@@ -22,7 +22,8 @@ module.exports = {
         docs: {
             description: "enforce dot notation whenever possible",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/dot-notation"
         },
 
         schema: [
diff --git a/lib/rules/eol-last.js b/lib/rules/eol-last.js
index 3933bc346..f96352676 100644
--- a/lib/rules/eol-last.js
+++ b/lib/rules/eol-last.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "require or disallow newline at the end of files",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/eol-last"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/eqeqeq.js b/lib/rules/eqeqeq.js
index 8801102e6..fc65450af 100644
--- a/lib/rules/eqeqeq.js
+++ b/lib/rules/eqeqeq.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "require the use of `===` and `!==`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/eqeqeq"
         },
 
         schema: {
diff --git a/lib/rules/for-direction.js b/lib/rules/for-direction.js
index 7178ced9d..c91888da2 100644
--- a/lib/rules/for-direction.js
+++ b/lib/rules/for-direction.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce \"for\" loop update clause moving the counter in the right direction.",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/for-direction"
         },
         fixable: null,
         schema: []
diff --git a/lib/rules/func-call-spacing.js b/lib/rules/func-call-spacing.js
index 00e677d33..b13613cf8 100644
--- a/lib/rules/func-call-spacing.js
+++ b/lib/rules/func-call-spacing.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "require or disallow spacing between function identifiers and their invocations",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/func-call-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/func-name-matching.js b/lib/rules/func-name-matching.js
index db06d5d46..85fd7d4f1 100644
--- a/lib/rules/func-name-matching.js
+++ b/lib/rules/func-name-matching.js
@@ -70,7 +70,8 @@ module.exports = {
         docs: {
             description: "require function names to match the name of the variable or property to which they are assigned",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/func-name-matching"
         },
 
         schema: {
diff --git a/lib/rules/func-names.js b/lib/rules/func-names.js
index 848ce9757..722f276c1 100644
--- a/lib/rules/func-names.js
+++ b/lib/rules/func-names.js
@@ -29,7 +29,8 @@ module.exports = {
         docs: {
             description: "require or disallow named `function` expressions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/func-names"
         },
 
         schema: [
diff --git a/lib/rules/func-style.js b/lib/rules/func-style.js
index 123eae3d8..ea6d74fb3 100644
--- a/lib/rules/func-style.js
+++ b/lib/rules/func-style.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "enforce the consistent use of either `function` declarations or expressions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/func-style"
         },
 
         schema: [
diff --git a/lib/rules/function-paren-newline.js b/lib/rules/function-paren-newline.js
index 10ad960a4..7e4f2792c 100644
--- a/lib/rules/function-paren-newline.js
+++ b/lib/rules/function-paren-newline.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce consistent line breaks inside function parentheses",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/function-paren-newline"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/generator-star-spacing.js b/lib/rules/generator-star-spacing.js
index a718b59af..282b37510 100644
--- a/lib/rules/generator-star-spacing.js
+++ b/lib/rules/generator-star-spacing.js
@@ -30,7 +30,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing around `*` operators in generator functions",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/generator-star-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/getter-return.js b/lib/rules/getter-return.js
index 6eb1efc00..58f2a3978 100644
--- a/lib/rules/getter-return.js
+++ b/lib/rules/getter-return.js
@@ -47,7 +47,8 @@ module.exports = {
         docs: {
             description: "enforce `return` statements in getters",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/getter-return"
         },
         fixable: null,
         schema: [
diff --git a/lib/rules/global-require.js b/lib/rules/global-require.js
index beda8d99f..a5f5335d0 100644
--- a/lib/rules/global-require.js
+++ b/lib/rules/global-require.js
@@ -51,7 +51,8 @@ module.exports = {
         docs: {
             description: "require `require()` calls to be placed at top-level module scope",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/global-require"
         },
 
         schema: []
diff --git a/lib/rules/guard-for-in.js b/lib/rules/guard-for-in.js
index 754830f6a..88a9106b3 100644
--- a/lib/rules/guard-for-in.js
+++ b/lib/rules/guard-for-in.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require `for-in` loops to include an `if` statement",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/guard-for-in"
         },
 
         schema: []
diff --git a/lib/rules/handle-callback-err.js b/lib/rules/handle-callback-err.js
index de36a0c1b..f6e6c108c 100644
--- a/lib/rules/handle-callback-err.js
+++ b/lib/rules/handle-callback-err.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require error handling in callbacks",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/handle-callback-err"
         },
 
         schema: [
diff --git a/lib/rules/id-blacklist.js b/lib/rules/id-blacklist.js
index ee28c0b5a..ba9b5d4b3 100644
--- a/lib/rules/id-blacklist.js
+++ b/lib/rules/id-blacklist.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow specified identifiers",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/id-blacklist"
         },
 
         schema: {
diff --git a/lib/rules/id-length.js b/lib/rules/id-length.js
index dad9c4064..eaed26217 100644
--- a/lib/rules/id-length.js
+++ b/lib/rules/id-length.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce minimum and maximum identifier lengths",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/id-length"
         },
 
         schema: [
diff --git a/lib/rules/id-match.js b/lib/rules/id-match.js
index 0420fdc74..608ef17d1 100644
--- a/lib/rules/id-match.js
+++ b/lib/rules/id-match.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require identifiers to match a specified regular expression",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/id-match"
         },
 
         schema: [
diff --git a/lib/rules/implicit-arrow-linebreak.js b/lib/rules/implicit-arrow-linebreak.js
index b8802f4de..a7ad1122b 100644
--- a/lib/rules/implicit-arrow-linebreak.js
+++ b/lib/rules/implicit-arrow-linebreak.js
@@ -12,7 +12,8 @@ module.exports = {
         docs: {
             description: "enforce the location of arrow function bodies",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/implicit-arrow-linebreak"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/indent-legacy.js b/lib/rules/indent-legacy.js
index cf9140680..701cf0163 100644
--- a/lib/rules/indent-legacy.js
+++ b/lib/rules/indent-legacy.js
@@ -25,7 +25,8 @@ module.exports = {
             description: "enforce consistent indentation",
             category: "Stylistic Issues",
             recommended: false,
-            replacedBy: ["indent"]
+            replacedBy: ["indent"],
+            url: "https://eslint.org/docs/rules/indent-legacy"
         },
 
         deprecated: true,
diff --git a/lib/rules/indent.js b/lib/rules/indent.js
index 511ee07c0..2159880f8 100644
--- a/lib/rules/indent.js
+++ b/lib/rules/indent.js
@@ -492,7 +492,8 @@ module.exports = {
         docs: {
             description: "enforce consistent indentation",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/indent"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/init-declarations.js b/lib/rules/init-declarations.js
index 1f53f3dfc..412b96dc0 100644
--- a/lib/rules/init-declarations.js
+++ b/lib/rules/init-declarations.js
@@ -47,7 +47,8 @@ module.exports = {
         docs: {
             description: "require or disallow initialization in variable declarations",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/init-declarations"
         },
 
         schema: {
diff --git a/lib/rules/jsx-quotes.js b/lib/rules/jsx-quotes.js
index 5653922d9..54ec481a8 100644
--- a/lib/rules/jsx-quotes.js
+++ b/lib/rules/jsx-quotes.js
@@ -41,7 +41,8 @@ module.exports = {
         docs: {
             description: "enforce the consistent use of either double or single quotes in JSX attributes",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/jsx-quotes"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/key-spacing.js b/lib/rules/key-spacing.js
index 1c62ad428..1ae4990a5 100644
--- a/lib/rules/key-spacing.js
+++ b/lib/rules/key-spacing.js
@@ -131,7 +131,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing between keys and values in object literal properties",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/key-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/keyword-spacing.js b/lib/rules/keyword-spacing.js
index 218cfd02b..d0dd64025 100644
--- a/lib/rules/keyword-spacing.js
+++ b/lib/rules/keyword-spacing.js
@@ -68,7 +68,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before and after keywords",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/keyword-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/line-comment-position.js b/lib/rules/line-comment-position.js
index 0df806cca..ebdb024f6 100644
--- a/lib/rules/line-comment-position.js
+++ b/lib/rules/line-comment-position.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce position of line comments",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/line-comment-position"
         },
 
         schema: [
diff --git a/lib/rules/linebreak-style.js b/lib/rules/linebreak-style.js
index 907bc02ec..d5a170f73 100644
--- a/lib/rules/linebreak-style.js
+++ b/lib/rules/linebreak-style.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "enforce consistent linebreak style",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/linebreak-style"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/lines-around-comment.js b/lib/rules/lines-around-comment.js
index 3df9cb86f..5d98473be 100644
--- a/lib/rules/lines-around-comment.js
+++ b/lib/rules/lines-around-comment.js
@@ -55,7 +55,8 @@ module.exports = {
         docs: {
             description: "require empty lines around comments",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/lines-around-comment"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/lines-around-directive.js b/lib/rules/lines-around-directive.js
index b560009f7..3ba3ab5bb 100644
--- a/lib/rules/lines-around-directive.js
+++ b/lib/rules/lines-around-directive.js
@@ -18,7 +18,8 @@ module.exports = {
             description: "require or disallow newlines around directives",
             category: "Stylistic Issues",
             recommended: false,
-            replacedBy: ["padding-line-between-statements"]
+            replacedBy: ["padding-line-between-statements"],
+            url: "https://eslint.org/docs/rules/lines-around-directive"
         },
         schema: [{
             oneOf: [
diff --git a/lib/rules/lines-between-class-members.js b/lib/rules/lines-between-class-members.js
index ab87f5e84..252984da5 100644
--- a/lib/rules/lines-between-class-members.js
+++ b/lib/rules/lines-between-class-members.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "require or disallow an empty line between class members",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/lines-between-class-members"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/max-depth.js b/lib/rules/max-depth.js
index 74c13ffa9..ead44b90c 100644
--- a/lib/rules/max-depth.js
+++ b/lib/rules/max-depth.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum depth that blocks can be nested",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-depth"
         },
 
         schema: [
diff --git a/lib/rules/max-len.js b/lib/rules/max-len.js
index 27d549c9c..35ac803b6 100644
--- a/lib/rules/max-len.js
+++ b/lib/rules/max-len.js
@@ -68,7 +68,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum line length",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-len"
         },
 
         schema: [
diff --git a/lib/rules/max-lines.js b/lib/rules/max-lines.js
index 297c75dc1..9bb4420ed 100644
--- a/lib/rules/max-lines.js
+++ b/lib/rules/max-lines.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum number of lines per file",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-lines"
         },
 
         schema: [
diff --git a/lib/rules/max-nested-callbacks.js b/lib/rules/max-nested-callbacks.js
index a89f49ae0..7d7386ec1 100644
--- a/lib/rules/max-nested-callbacks.js
+++ b/lib/rules/max-nested-callbacks.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum depth that callbacks can be nested",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-nested-callbacks"
         },
 
         schema: [
diff --git a/lib/rules/max-params.js b/lib/rules/max-params.js
index 85838adac..d7c22c527 100644
--- a/lib/rules/max-params.js
+++ b/lib/rules/max-params.js
@@ -22,7 +22,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum number of parameters in function definitions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-params"
         },
 
         schema: [
diff --git a/lib/rules/max-statements-per-line.js b/lib/rules/max-statements-per-line.js
index 3d18da4ee..a6776bdea 100644
--- a/lib/rules/max-statements-per-line.js
+++ b/lib/rules/max-statements-per-line.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum number of statements allowed per line",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-statements-per-line"
         },
 
         schema: [
diff --git a/lib/rules/max-statements.js b/lib/rules/max-statements.js
index f98aa3a21..faa0d5d84 100644
--- a/lib/rules/max-statements.js
+++ b/lib/rules/max-statements.js
@@ -22,7 +22,8 @@ module.exports = {
         docs: {
             description: "enforce a maximum number of statements allowed in function blocks",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/max-statements"
         },
 
         schema: [
diff --git a/lib/rules/multiline-comment-style.js b/lib/rules/multiline-comment-style.js
index db4f76844..4da9a619f 100644
--- a/lib/rules/multiline-comment-style.js
+++ b/lib/rules/multiline-comment-style.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce a particular style for multiline comments",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/multiline-comment-style"
         },
         fixable: "whitespace",
         schema: [{ enum: ["starred-block", "separate-lines", "bare-block"] }]
diff --git a/lib/rules/multiline-ternary.js b/lib/rules/multiline-ternary.js
index a74f241d8..10cf269fb 100644
--- a/lib/rules/multiline-ternary.js
+++ b/lib/rules/multiline-ternary.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce newlines between operands of ternary expressions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/multiline-ternary"
         },
         schema: [
             {
diff --git a/lib/rules/new-cap.js b/lib/rules/new-cap.js
index f01e8f90a..cc33e3b81 100644
--- a/lib/rules/new-cap.js
+++ b/lib/rules/new-cap.js
@@ -77,7 +77,8 @@ module.exports = {
         docs: {
             description: "require constructor names to begin with a capital letter",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/new-cap"
         },
 
         schema: [
diff --git a/lib/rules/new-parens.js b/lib/rules/new-parens.js
index aa0f7fe93..abf2e032b 100644
--- a/lib/rules/new-parens.js
+++ b/lib/rules/new-parens.js
@@ -24,7 +24,8 @@ module.exports = {
         docs: {
             description: "require parentheses when invoking a constructor with no arguments",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/new-parens"
         },
 
         schema: [],
diff --git a/lib/rules/newline-after-var.js b/lib/rules/newline-after-var.js
index 80f73c836..b11d9d995 100644
--- a/lib/rules/newline-after-var.js
+++ b/lib/rules/newline-after-var.js
@@ -22,7 +22,8 @@ module.exports = {
             description: "require or disallow an empty line after variable declarations",
             category: "Stylistic Issues",
             recommended: false,
-            replacedBy: ["padding-line-between-statements"]
+            replacedBy: ["padding-line-between-statements"],
+            url: "https://eslint.org/docs/rules/newline-after-var"
         },
 
         schema: [
diff --git a/lib/rules/newline-before-return.js b/lib/rules/newline-before-return.js
index 02bd66db1..5bc1f7031 100644
--- a/lib/rules/newline-before-return.js
+++ b/lib/rules/newline-before-return.js
@@ -15,7 +15,8 @@ module.exports = {
             description: "require an empty line before `return` statements",
             category: "Stylistic Issues",
             recommended: false,
-            replacedBy: ["padding-line-between-statements"]
+            replacedBy: ["padding-line-between-statements"],
+            url: "https://eslint.org/docs/rules/newline-before-return"
         },
         fixable: "whitespace",
         schema: [],
diff --git a/lib/rules/newline-per-chained-call.js b/lib/rules/newline-per-chained-call.js
index 356c4baf3..9691da44e 100644
--- a/lib/rules/newline-per-chained-call.js
+++ b/lib/rules/newline-per-chained-call.js
@@ -17,7 +17,8 @@ module.exports = {
         docs: {
             description: "require a newline after each call in a method chain",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/newline-per-chained-call"
         },
         fixable: "whitespace",
         schema: [{
diff --git a/lib/rules/no-alert.js b/lib/rules/no-alert.js
index bc1087253..b4fd23121 100644
--- a/lib/rules/no-alert.js
+++ b/lib/rules/no-alert.js
@@ -88,7 +88,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `alert`, `confirm`, and `prompt`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-alert"
         },
 
         schema: []
diff --git a/lib/rules/no-array-constructor.js b/lib/rules/no-array-constructor.js
index 70dc8b4cd..187389fdf 100644
--- a/lib/rules/no-array-constructor.js
+++ b/lib/rules/no-array-constructor.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `Array` constructors",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-array-constructor"
         },
 
         schema: []
diff --git a/lib/rules/no-await-in-loop.js b/lib/rules/no-await-in-loop.js
index d1ed92b70..7d4f8a0a6 100644
--- a/lib/rules/no-await-in-loop.js
+++ b/lib/rules/no-await-in-loop.js
@@ -28,7 +28,8 @@ module.exports = {
         docs: {
             description: "disallow `await` inside of loops",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-await-in-loop"
         },
         schema: []
     },
diff --git a/lib/rules/no-bitwise.js b/lib/rules/no-bitwise.js
index f062ad266..8376674f6 100644
--- a/lib/rules/no-bitwise.js
+++ b/lib/rules/no-bitwise.js
@@ -25,7 +25,8 @@ module.exports = {
         docs: {
             description: "disallow bitwise operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-bitwise"
         },
 
         schema: [
diff --git a/lib/rules/no-buffer-constructor.js b/lib/rules/no-buffer-constructor.js
index 1521ff284..55f181ee6 100644
--- a/lib/rules/no-buffer-constructor.js
+++ b/lib/rules/no-buffer-constructor.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow use of the Buffer() constructor",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-buffer-constructor"
         },
         schema: []
     },
diff --git a/lib/rules/no-caller.js b/lib/rules/no-caller.js
index 55a37b7d8..df10bf373 100644
--- a/lib/rules/no-caller.js
+++ b/lib/rules/no-caller.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `arguments.caller` or `arguments.callee`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-caller"
         },
 
         schema: []
diff --git a/lib/rules/no-case-declarations.js b/lib/rules/no-case-declarations.js
index e801c6bb6..03c730ddb 100644
--- a/lib/rules/no-case-declarations.js
+++ b/lib/rules/no-case-declarations.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow lexical declarations in case clauses",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-case-declarations"
         },
 
         schema: []
diff --git a/lib/rules/no-catch-shadow.js b/lib/rules/no-catch-shadow.js
index bef61902e..69a4e6aff 100644
--- a/lib/rules/no-catch-shadow.js
+++ b/lib/rules/no-catch-shadow.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow `catch` clause parameters from shadowing variables in the outer scope",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-catch-shadow"
         },
 
         schema: []
diff --git a/lib/rules/no-class-assign.js b/lib/rules/no-class-assign.js
index 4b0443abc..56e75122a 100644
--- a/lib/rules/no-class-assign.js
+++ b/lib/rules/no-class-assign.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow reassigning class members",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-class-assign"
         },
 
         schema: []
diff --git a/lib/rules/no-compare-neg-zero.js b/lib/rules/no-compare-neg-zero.js
index 604e22191..09cf29506 100644
--- a/lib/rules/no-compare-neg-zero.js
+++ b/lib/rules/no-compare-neg-zero.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow comparing against -0",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-compare-neg-zero"
         },
         fixable: null,
         schema: []
diff --git a/lib/rules/no-cond-assign.js b/lib/rules/no-cond-assign.js
index 7c031c13f..e761be14e 100644
--- a/lib/rules/no-cond-assign.js
+++ b/lib/rules/no-cond-assign.js
@@ -22,7 +22,8 @@ module.exports = {
         docs: {
             description: "disallow assignment operators in conditional expressions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-cond-assign"
         },
 
         schema: [
diff --git a/lib/rules/no-confusing-arrow.js b/lib/rules/no-confusing-arrow.js
index fc69ca39a..542a4060e 100644
--- a/lib/rules/no-confusing-arrow.js
+++ b/lib/rules/no-confusing-arrow.js
@@ -30,7 +30,8 @@ module.exports = {
         docs: {
             description: "disallow arrow functions where they could be confused with comparisons",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-confusing-arrow"
         },
 
         fixable: "code",
diff --git a/lib/rules/no-console.js b/lib/rules/no-console.js
index f5a3a235e..b00582eba 100644
--- a/lib/rules/no-console.js
+++ b/lib/rules/no-console.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `console`",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-console"
         },
 
         schema: [
diff --git a/lib/rules/no-const-assign.js b/lib/rules/no-const-assign.js
index db1848a98..8a08a52df 100644
--- a/lib/rules/no-const-assign.js
+++ b/lib/rules/no-const-assign.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow reassigning `const` variables",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-const-assign"
         },
 
         schema: []
diff --git a/lib/rules/no-constant-condition.js b/lib/rules/no-constant-condition.js
index 0cd445dfd..5611d617e 100644
--- a/lib/rules/no-constant-condition.js
+++ b/lib/rules/no-constant-condition.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow constant expressions in conditions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-constant-condition"
         },
 
         schema: [
diff --git a/lib/rules/no-continue.js b/lib/rules/no-continue.js
index 2615fba13..52061ef53 100644
--- a/lib/rules/no-continue.js
+++ b/lib/rules/no-continue.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `continue` statements",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-continue"
         },
 
         schema: []
diff --git a/lib/rules/no-control-regex.js b/lib/rules/no-control-regex.js
index 14981f4ab..676c66612 100644
--- a/lib/rules/no-control-regex.js
+++ b/lib/rules/no-control-regex.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow control characters in regular expressions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-control-regex"
         },
 
         schema: []
diff --git a/lib/rules/no-debugger.js b/lib/rules/no-debugger.js
index d79cb1816..7d816e3a0 100644
--- a/lib/rules/no-debugger.js
+++ b/lib/rules/no-debugger.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `debugger`",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-debugger"
         },
         fixable: "code",
         schema: []
diff --git a/lib/rules/no-delete-var.js b/lib/rules/no-delete-var.js
index adc1b5bb9..9ca09f1de 100644
--- a/lib/rules/no-delete-var.js
+++ b/lib/rules/no-delete-var.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow deleting variables",
             category: "Variables",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-delete-var"
         },
 
         schema: []
diff --git a/lib/rules/no-div-regex.js b/lib/rules/no-div-regex.js
index 84a9b9a3a..87423f886 100644
--- a/lib/rules/no-div-regex.js
+++ b/lib/rules/no-div-regex.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow division operators explicitly at the beginning of regular expressions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-div-regex"
         },
 
         schema: []
diff --git a/lib/rules/no-dupe-args.js b/lib/rules/no-dupe-args.js
index c932be01d..a71d01f9b 100644
--- a/lib/rules/no-dupe-args.js
+++ b/lib/rules/no-dupe-args.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow duplicate arguments in `function` definitions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-dupe-args"
         },
 
         schema: []
diff --git a/lib/rules/no-dupe-class-members.js b/lib/rules/no-dupe-class-members.js
index 07b999fab..cc7f8da28 100644
--- a/lib/rules/no-dupe-class-members.js
+++ b/lib/rules/no-dupe-class-members.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow duplicate class members",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-dupe-class-members"
         },
 
         schema: []
diff --git a/lib/rules/no-dupe-keys.js b/lib/rules/no-dupe-keys.js
index 0120d0b38..10955e450 100644
--- a/lib/rules/no-dupe-keys.js
+++ b/lib/rules/no-dupe-keys.js
@@ -87,7 +87,8 @@ module.exports = {
         docs: {
             description: "disallow duplicate keys in object literals",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-dupe-keys"
         },
 
         schema: []
diff --git a/lib/rules/no-duplicate-case.js b/lib/rules/no-duplicate-case.js
index 07823f284..2a9d95511 100644
--- a/lib/rules/no-duplicate-case.js
+++ b/lib/rules/no-duplicate-case.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow duplicate case labels",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-duplicate-case"
         },
 
         schema: []
diff --git a/lib/rules/no-duplicate-imports.js b/lib/rules/no-duplicate-imports.js
index d12c3a56d..32071da15 100644
--- a/lib/rules/no-duplicate-imports.js
+++ b/lib/rules/no-duplicate-imports.js
@@ -104,7 +104,8 @@ module.exports = {
         docs: {
             description: "disallow duplicate module imports",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-duplicate-imports"
         },
 
         schema: [{
diff --git a/lib/rules/no-else-return.js b/lib/rules/no-else-return.js
index deeff41ab..91cb5b979 100644
--- a/lib/rules/no-else-return.js
+++ b/lib/rules/no-else-return.js
@@ -21,7 +21,8 @@ module.exports = {
         docs: {
             description: "disallow `else` blocks after `return` statements in `if` statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-else-return"
         },
 
         schema: [{
diff --git a/lib/rules/no-empty-character-class.js b/lib/rules/no-empty-character-class.js
index 0ea7c5a0d..3c4806632 100644
--- a/lib/rules/no-empty-character-class.js
+++ b/lib/rules/no-empty-character-class.js
@@ -32,7 +32,8 @@ module.exports = {
         docs: {
             description: "disallow empty character classes in regular expressions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-empty-character-class"
         },
 
         schema: []
diff --git a/lib/rules/no-empty-function.js b/lib/rules/no-empty-function.js
index 38c915c33..3852774e6 100644
--- a/lib/rules/no-empty-function.js
+++ b/lib/rules/no-empty-function.js
@@ -93,7 +93,8 @@ module.exports = {
         docs: {
             description: "disallow empty functions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-empty-function"
         },
 
         schema: [
diff --git a/lib/rules/no-empty-pattern.js b/lib/rules/no-empty-pattern.js
index 11f50b541..1d0c3ab4b 100644
--- a/lib/rules/no-empty-pattern.js
+++ b/lib/rules/no-empty-pattern.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow empty destructuring patterns",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-empty-pattern"
         },
 
         schema: []
diff --git a/lib/rules/no-empty.js b/lib/rules/no-empty.js
index b71b8582a..15f1df679 100644
--- a/lib/rules/no-empty.js
+++ b/lib/rules/no-empty.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow empty block statements",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-empty"
         },
 
         schema: [
diff --git a/lib/rules/no-eq-null.js b/lib/rules/no-eq-null.js
index 7e915a8c7..befb9d46f 100644
--- a/lib/rules/no-eq-null.js
+++ b/lib/rules/no-eq-null.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow `null` comparisons without type-checking operators",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-eq-null"
         },
 
         schema: []
diff --git a/lib/rules/no-eval.js b/lib/rules/no-eval.js
index ee5f577f4..8cf4aa307 100644
--- a/lib/rules/no-eval.js
+++ b/lib/rules/no-eval.js
@@ -79,7 +79,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `eval()`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-eval"
         },
 
         schema: [
diff --git a/lib/rules/no-ex-assign.js b/lib/rules/no-ex-assign.js
index 20869d5cd..6ede2fc21 100644
--- a/lib/rules/no-ex-assign.js
+++ b/lib/rules/no-ex-assign.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow reassigning exceptions in `catch` clauses",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-ex-assign"
         },
 
         schema: []
diff --git a/lib/rules/no-extend-native.js b/lib/rules/no-extend-native.js
index c550cf5da..2e170017a 100644
--- a/lib/rules/no-extend-native.js
+++ b/lib/rules/no-extend-native.js
@@ -27,7 +27,8 @@ module.exports = {
         docs: {
             description: "disallow extending native types",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-extend-native"
         },
 
         schema: [
diff --git a/lib/rules/no-extra-bind.js b/lib/rules/no-extra-bind.js
index 2d22eff24..21b96c3c2 100644
--- a/lib/rules/no-extra-bind.js
+++ b/lib/rules/no-extra-bind.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary calls to `.bind()`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-extra-bind"
         },
 
         schema: [],
diff --git a/lib/rules/no-extra-boolean-cast.js b/lib/rules/no-extra-boolean-cast.js
index 47ca7e22f..471e8b5b8 100644
--- a/lib/rules/no-extra-boolean-cast.js
+++ b/lib/rules/no-extra-boolean-cast.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary boolean casts",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-extra-boolean-cast"
         },
 
         schema: [],
diff --git a/lib/rules/no-extra-label.js b/lib/rules/no-extra-label.js
index b89267de9..f90a403cb 100644
--- a/lib/rules/no-extra-label.js
+++ b/lib/rules/no-extra-label.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary labels",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-extra-label"
         },
 
         schema: [],
diff --git a/lib/rules/no-extra-parens.js b/lib/rules/no-extra-parens.js
index d8e0df64a..4bf8f9950 100644
--- a/lib/rules/no-extra-parens.js
+++ b/lib/rules/no-extra-parens.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary parentheses",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-extra-parens"
         },
 
         fixable: "code",
@@ -582,7 +583,7 @@ module.exports = {
                         tokensToIgnore.add(firstLeftToken);
                     }
                 }
-                if (hasExcessParens(node.right)) {
+                if (!(node.type === "ForOfStatement" && node.right.type === "SequenceExpression") && hasExcessParens(node.right)) {
                     report(node.right);
                 }
                 if (hasExcessParens(node.left)) {
diff --git a/lib/rules/no-extra-semi.js b/lib/rules/no-extra-semi.js
index acd312b32..5668c7e09 100644
--- a/lib/rules/no-extra-semi.js
+++ b/lib/rules/no-extra-semi.js
@@ -21,7 +21,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary semicolons",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-extra-semi"
         },
 
         fixable: "code",
diff --git a/lib/rules/no-fallthrough.js b/lib/rules/no-fallthrough.js
index 082e8431d..ce4f91ad9 100644
--- a/lib/rules/no-fallthrough.js
+++ b/lib/rules/no-fallthrough.js
@@ -58,7 +58,8 @@ module.exports = {
         docs: {
             description: "disallow fallthrough of `case` statements",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-fallthrough"
         },
 
         schema: [
diff --git a/lib/rules/no-floating-decimal.js b/lib/rules/no-floating-decimal.js
index dfba453a4..da8c47912 100644
--- a/lib/rules/no-floating-decimal.js
+++ b/lib/rules/no-floating-decimal.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow leading or trailing decimal points in numeric literals",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-floating-decimal"
         },
 
         schema: [],
diff --git a/lib/rules/no-func-assign.js b/lib/rules/no-func-assign.js
index ea86365b2..a0a17f369 100644
--- a/lib/rules/no-func-assign.js
+++ b/lib/rules/no-func-assign.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow reassigning `function` declarations",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-func-assign"
         },
 
         schema: []
diff --git a/lib/rules/no-global-assign.js b/lib/rules/no-global-assign.js
index 679650cb7..3397bdbe0 100644
--- a/lib/rules/no-global-assign.js
+++ b/lib/rules/no-global-assign.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow assignments to native objects or read-only global variables",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-global-assign"
         },
 
         schema: [
diff --git a/lib/rules/no-implicit-coercion.js b/lib/rules/no-implicit-coercion.js
index 24e04858f..7efab8393 100644
--- a/lib/rules/no-implicit-coercion.js
+++ b/lib/rules/no-implicit-coercion.js
@@ -156,7 +156,8 @@ module.exports = {
         docs: {
             description: "disallow shorthand type conversions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-implicit-coercion"
         },
 
         fixable: "code",
diff --git a/lib/rules/no-implicit-globals.js b/lib/rules/no-implicit-globals.js
index f0962cdc7..c4717b6a3 100644
--- a/lib/rules/no-implicit-globals.js
+++ b/lib/rules/no-implicit-globals.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow variable and `function` declarations in the global scope",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-implicit-globals"
         },
 
         schema: []
diff --git a/lib/rules/no-implied-eval.js b/lib/rules/no-implied-eval.js
index cfb16dbf7..de294bc88 100644
--- a/lib/rules/no-implied-eval.js
+++ b/lib/rules/no-implied-eval.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `eval()`-like methods",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-implied-eval"
         },
 
         schema: []
diff --git a/lib/rules/no-inline-comments.js b/lib/rules/no-inline-comments.js
index 42b4753df..85a0d3831 100644
--- a/lib/rules/no-inline-comments.js
+++ b/lib/rules/no-inline-comments.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow inline comments after code",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-inline-comments"
         },
 
         schema: []
diff --git a/lib/rules/no-inner-declarations.js b/lib/rules/no-inner-declarations.js
index 28aa5b4b5..032c0a0f0 100644
--- a/lib/rules/no-inner-declarations.js
+++ b/lib/rules/no-inner-declarations.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow variable or `function` declarations in nested blocks",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-inner-declarations"
         },
 
         schema: [
diff --git a/lib/rules/no-invalid-regexp.js b/lib/rules/no-invalid-regexp.js
index 45596f7ee..8ccb5242b 100644
--- a/lib/rules/no-invalid-regexp.js
+++ b/lib/rules/no-invalid-regexp.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow invalid regular expression strings in `RegExp` constructors",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-invalid-regexp"
         },
 
         schema: [{
diff --git a/lib/rules/no-invalid-this.js b/lib/rules/no-invalid-this.js
index 5a0a62f7a..a04673be8 100644
--- a/lib/rules/no-invalid-this.js
+++ b/lib/rules/no-invalid-this.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow `this` keywords outside of classes or class-like objects",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-invalid-this"
         },
 
         schema: []
diff --git a/lib/rules/no-irregular-whitespace.js b/lib/rules/no-irregular-whitespace.js
index cfbdfd1a5..e36ec88b0 100644
--- a/lib/rules/no-irregular-whitespace.js
+++ b/lib/rules/no-irregular-whitespace.js
@@ -30,7 +30,8 @@ module.exports = {
         docs: {
             description: "disallow irregular whitespace outside of strings and comments",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-irregular-whitespace"
         },
 
         schema: [
diff --git a/lib/rules/no-iterator.js b/lib/rules/no-iterator.js
index 3677dd94d..ca12fcda4 100644
--- a/lib/rules/no-iterator.js
+++ b/lib/rules/no-iterator.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow the use of the `__iterator__` property",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-iterator"
         },
 
         schema: []
diff --git a/lib/rules/no-label-var.js b/lib/rules/no-label-var.js
index 954066aef..a880abfca 100644
--- a/lib/rules/no-label-var.js
+++ b/lib/rules/no-label-var.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow labels that share a name with a variable",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-label-var"
         },
 
         schema: []
diff --git a/lib/rules/no-labels.js b/lib/rules/no-labels.js
index 101092a66..e09bb7b6e 100644
--- a/lib/rules/no-labels.js
+++ b/lib/rules/no-labels.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow labeled statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-labels"
         },
 
         schema: [
diff --git a/lib/rules/no-lone-blocks.js b/lib/rules/no-lone-blocks.js
index 2b5666e21..5e22aacf0 100644
--- a/lib/rules/no-lone-blocks.js
+++ b/lib/rules/no-lone-blocks.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary nested blocks",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-lone-blocks"
         },
 
         schema: []
diff --git a/lib/rules/no-lonely-if.js b/lib/rules/no-lonely-if.js
index db127d194..3ecc41e8c 100644
--- a/lib/rules/no-lonely-if.js
+++ b/lib/rules/no-lonely-if.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow `if` statements as the only statement in `else` blocks",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-lonely-if"
         },
 
         schema: [],
diff --git a/lib/rules/no-loop-func.js b/lib/rules/no-loop-func.js
index c97e0c3c5..0dce09a61 100644
--- a/lib/rules/no-loop-func.js
+++ b/lib/rules/no-loop-func.js
@@ -159,7 +159,8 @@ module.exports = {
         docs: {
             description: "disallow `function` declarations and expressions inside loop statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-loop-func"
         },
 
         schema: []
diff --git a/lib/rules/no-magic-numbers.js b/lib/rules/no-magic-numbers.js
index 796ecff0f..20a752e55 100644
--- a/lib/rules/no-magic-numbers.js
+++ b/lib/rules/no-magic-numbers.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow magic numbers",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-magic-numbers"
         },
 
         schema: [{
diff --git a/lib/rules/no-mixed-operators.js b/lib/rules/no-mixed-operators.js
index 9f1fbc9a6..0df42259d 100644
--- a/lib/rules/no-mixed-operators.js
+++ b/lib/rules/no-mixed-operators.js
@@ -74,7 +74,8 @@ module.exports = {
         docs: {
             description: "disallow mixed binary operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-mixed-operators"
         },
         schema: [
             {
diff --git a/lib/rules/no-mixed-requires.js b/lib/rules/no-mixed-requires.js
index 171052a52..1058f3a51 100644
--- a/lib/rules/no-mixed-requires.js
+++ b/lib/rules/no-mixed-requires.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `require` calls to be mixed with regular variable declarations",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-mixed-requires"
         },
 
         schema: [
diff --git a/lib/rules/no-mixed-spaces-and-tabs.js b/lib/rules/no-mixed-spaces-and-tabs.js
index 2b8e89d3c..7cb4b4cee 100644
--- a/lib/rules/no-mixed-spaces-and-tabs.js
+++ b/lib/rules/no-mixed-spaces-and-tabs.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow mixed spaces and tabs for indentation",
             category: "Stylistic Issues",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-mixed-spaces-and-tabs"
         },
 
         schema: [
diff --git a/lib/rules/no-multi-assign.js b/lib/rules/no-multi-assign.js
index 164869f6d..ca3f778ac 100644
--- a/lib/rules/no-multi-assign.js
+++ b/lib/rules/no-multi-assign.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow use of chained assignment expressions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-multi-assign"
         },
         schema: []
     },
diff --git a/lib/rules/no-multi-spaces.js b/lib/rules/no-multi-spaces.js
index 84f1b5018..d0ca097ad 100644
--- a/lib/rules/no-multi-spaces.js
+++ b/lib/rules/no-multi-spaces.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow multiple spaces",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-multi-spaces"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/no-multi-str.js b/lib/rules/no-multi-str.js
index 76f29cbb5..2b97c261e 100644
--- a/lib/rules/no-multi-str.js
+++ b/lib/rules/no-multi-str.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow multiline strings",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-multi-str"
         },
 
         schema: []
diff --git a/lib/rules/no-multiple-empty-lines.js b/lib/rules/no-multiple-empty-lines.js
index 9d1067c20..a111786a3 100644
--- a/lib/rules/no-multiple-empty-lines.js
+++ b/lib/rules/no-multiple-empty-lines.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow multiple empty lines",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-multiple-empty-lines"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/no-native-reassign.js b/lib/rules/no-native-reassign.js
index a60d4e499..b1064b0bb 100644
--- a/lib/rules/no-native-reassign.js
+++ b/lib/rules/no-native-reassign.js
@@ -16,7 +16,8 @@ module.exports = {
             description: "disallow assignments to native objects or read-only global variables",
             category: "Best Practices",
             recommended: false,
-            replacedBy: ["no-global-assign"]
+            replacedBy: ["no-global-assign"],
+            url: "https://eslint.org/docs/rules/no-native-reassign"
         },
 
         deprecated: true,
diff --git a/lib/rules/no-negated-condition.js b/lib/rules/no-negated-condition.js
index 8ea8559ea..254dcb5c2 100644
--- a/lib/rules/no-negated-condition.js
+++ b/lib/rules/no-negated-condition.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow negated conditions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-negated-condition"
         },
 
         schema: []
diff --git a/lib/rules/no-negated-in-lhs.js b/lib/rules/no-negated-in-lhs.js
index 495cbc160..7f08814c9 100644
--- a/lib/rules/no-negated-in-lhs.js
+++ b/lib/rules/no-negated-in-lhs.js
@@ -16,7 +16,8 @@ module.exports = {
             description: "disallow negating the left operand in `in` expressions",
             category: "Possible Errors",
             recommended: false,
-            replacedBy: ["no-unsafe-negation"]
+            replacedBy: ["no-unsafe-negation"],
+            url: "https://eslint.org/docs/rules/no-negated-in-lhs"
         },
         deprecated: true,
 
diff --git a/lib/rules/no-nested-ternary.js b/lib/rules/no-nested-ternary.js
index 4fe49fc9c..15e72f20d 100644
--- a/lib/rules/no-nested-ternary.js
+++ b/lib/rules/no-nested-ternary.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow nested ternary expressions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-nested-ternary"
         },
 
         schema: []
diff --git a/lib/rules/no-new-func.js b/lib/rules/no-new-func.js
index 6abbe8391..8ee327baa 100644
--- a/lib/rules/no-new-func.js
+++ b/lib/rules/no-new-func.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `new` operators with the `Function` object",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-new-func"
         },
 
         schema: []
diff --git a/lib/rules/no-new-object.js b/lib/rules/no-new-object.js
index d4d77b551..3f68cbc1b 100644
--- a/lib/rules/no-new-object.js
+++ b/lib/rules/no-new-object.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `Object` constructors",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-new-object"
         },
 
         schema: []
diff --git a/lib/rules/no-new-require.js b/lib/rules/no-new-require.js
index f9ea1f84b..f74daa756 100644
--- a/lib/rules/no-new-require.js
+++ b/lib/rules/no-new-require.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `new` operators with calls to `require`",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-new-require"
         },
 
         schema: []
diff --git a/lib/rules/no-new-symbol.js b/lib/rules/no-new-symbol.js
index 5743a4748..a537268e3 100644
--- a/lib/rules/no-new-symbol.js
+++ b/lib/rules/no-new-symbol.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `new` operators with the `Symbol` object",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-new-symbol"
         },
 
         schema: []
diff --git a/lib/rules/no-new-wrappers.js b/lib/rules/no-new-wrappers.js
index 65bf79b87..e8d516212 100644
--- a/lib/rules/no-new-wrappers.js
+++ b/lib/rules/no-new-wrappers.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `new` operators with the `String`, `Number`, and `Boolean` objects",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-new-wrappers"
         },
 
         schema: []
diff --git a/lib/rules/no-new.js b/lib/rules/no-new.js
index 6e6025aac..f9121bc18 100644
--- a/lib/rules/no-new.js
+++ b/lib/rules/no-new.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow `new` operators outside of assignments or comparisons",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-new"
         },
 
         schema: []
diff --git a/lib/rules/no-obj-calls.js b/lib/rules/no-obj-calls.js
index 0ca8a5eff..320343cb2 100644
--- a/lib/rules/no-obj-calls.js
+++ b/lib/rules/no-obj-calls.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow calling global object properties as functions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-obj-calls"
         },
 
         schema: []
diff --git a/lib/rules/no-octal-escape.js b/lib/rules/no-octal-escape.js
index 04bfb6aae..e9509b87f 100644
--- a/lib/rules/no-octal-escape.js
+++ b/lib/rules/no-octal-escape.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow octal escape sequences in string literals",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-octal-escape"
         },
 
         schema: []
diff --git a/lib/rules/no-octal.js b/lib/rules/no-octal.js
index 58082d0d1..d782c23a3 100644
--- a/lib/rules/no-octal.js
+++ b/lib/rules/no-octal.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow octal literals",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-octal"
         },
 
         schema: []
diff --git a/lib/rules/no-param-reassign.js b/lib/rules/no-param-reassign.js
index f32e42ae2..be1a55917 100644
--- a/lib/rules/no-param-reassign.js
+++ b/lib/rules/no-param-reassign.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow reassigning `function` parameters",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-param-reassign"
         },
 
         schema: [
diff --git a/lib/rules/no-path-concat.js b/lib/rules/no-path-concat.js
index 1e153a43b..1dee7bda1 100644
--- a/lib/rules/no-path-concat.js
+++ b/lib/rules/no-path-concat.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow string concatenation with `__dirname` and `__filename`",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-path-concat"
         },
 
         schema: []
diff --git a/lib/rules/no-plusplus.js b/lib/rules/no-plusplus.js
index 94f259ac9..f754b3672 100644
--- a/lib/rules/no-plusplus.js
+++ b/lib/rules/no-plusplus.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow the unary operators `++` and `--`",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-plusplus"
         },
 
         schema: [
diff --git a/lib/rules/no-process-env.js b/lib/rules/no-process-env.js
index ef58b38e3..71b27ffd7 100644
--- a/lib/rules/no-process-env.js
+++ b/lib/rules/no-process-env.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `process.env`",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-process-env"
         },
 
         schema: []
diff --git a/lib/rules/no-process-exit.js b/lib/rules/no-process-exit.js
index 04e423b88..2d22d7fd9 100644
--- a/lib/rules/no-process-exit.js
+++ b/lib/rules/no-process-exit.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `process.exit()`",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-process-exit"
         },
 
         schema: []
diff --git a/lib/rules/no-proto.js b/lib/rules/no-proto.js
index 933746f55..e37c6c22e 100644
--- a/lib/rules/no-proto.js
+++ b/lib/rules/no-proto.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow the use of the `__proto__` property",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-proto"
         },
 
         schema: []
diff --git a/lib/rules/no-prototype-builtins.js b/lib/rules/no-prototype-builtins.js
index b9f040eaf..f52847f44 100644
--- a/lib/rules/no-prototype-builtins.js
+++ b/lib/rules/no-prototype-builtins.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow calling some `Object.prototype` methods directly on objects",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-prototype-builtins"
         },
 
         schema: []
diff --git a/lib/rules/no-redeclare.js b/lib/rules/no-redeclare.js
index ccb57003e..79ab21137 100644
--- a/lib/rules/no-redeclare.js
+++ b/lib/rules/no-redeclare.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow variable redeclaration",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-redeclare"
         },
 
         schema: [
diff --git a/lib/rules/no-regex-spaces.js b/lib/rules/no-regex-spaces.js
index 9250437ca..a50692a4c 100644
--- a/lib/rules/no-regex-spaces.js
+++ b/lib/rules/no-regex-spaces.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow multiple spaces in regular expressions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-regex-spaces"
         },
 
         schema: [],
diff --git a/lib/rules/no-restricted-globals.js b/lib/rules/no-restricted-globals.js
index 75428fc17..691e55d19 100644
--- a/lib/rules/no-restricted-globals.js
+++ b/lib/rules/no-restricted-globals.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow specified global variables",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-restricted-globals"
         },
 
         schema: {
diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js
index eb477b4be..11d09d6d2 100644
--- a/lib/rules/no-restricted-imports.js
+++ b/lib/rules/no-restricted-imports.js
@@ -56,7 +56,8 @@ module.exports = {
         docs: {
             description: "disallow specified modules when loaded by `import`",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-restricted-imports"
         },
 
         schema: {
diff --git a/lib/rules/no-restricted-modules.js b/lib/rules/no-restricted-modules.js
index cd4797573..54271094f 100644
--- a/lib/rules/no-restricted-modules.js
+++ b/lib/rules/no-restricted-modules.js
@@ -50,7 +50,8 @@ module.exports = {
         docs: {
             description: "disallow specified modules when loaded by `require`",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-restricted-modules"
         },
 
         schema: {
diff --git a/lib/rules/no-restricted-properties.js b/lib/rules/no-restricted-properties.js
index cdc73f9e4..71cc83c65 100644
--- a/lib/rules/no-restricted-properties.js
+++ b/lib/rules/no-restricted-properties.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow certain properties on certain objects",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-restricted-properties"
         },
 
         schema: {
diff --git a/lib/rules/no-restricted-syntax.js b/lib/rules/no-restricted-syntax.js
index 1798065ec..c472d9432 100644
--- a/lib/rules/no-restricted-syntax.js
+++ b/lib/rules/no-restricted-syntax.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow specified syntax",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-restricted-syntax"
         },
 
         schema: {
diff --git a/lib/rules/no-return-assign.js b/lib/rules/no-return-assign.js
index 882f94b72..0a016cfad 100644
--- a/lib/rules/no-return-assign.js
+++ b/lib/rules/no-return-assign.js
@@ -25,7 +25,8 @@ module.exports = {
         docs: {
             description: "disallow assignment operators in `return` statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-return-assign"
         },
 
         schema: [
diff --git a/lib/rules/no-return-await.js b/lib/rules/no-return-await.js
index 2f06b6110..490ccaeb3 100644
--- a/lib/rules/no-return-await.js
+++ b/lib/rules/no-return-await.js
@@ -17,7 +17,11 @@ module.exports = {
         docs: {
             description: "disallow unnecessary `return await`",
             category: "Best Practices",
-            recommended: false // TODO: set to true
+
+            // TODO: set to true
+            recommended: false,
+
+            url: "https://eslint.org/docs/rules/no-return-await"
         },
         fixable: null,
         schema: [
diff --git a/lib/rules/no-script-url.js b/lib/rules/no-script-url.js
index 98f988ff1..ba74dafb8 100644
--- a/lib/rules/no-script-url.js
+++ b/lib/rules/no-script-url.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow `javascript:` urls",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-script-url"
         },
 
         schema: []
diff --git a/lib/rules/no-self-assign.js b/lib/rules/no-self-assign.js
index 48b922d46..301404200 100644
--- a/lib/rules/no-self-assign.js
+++ b/lib/rules/no-self-assign.js
@@ -166,7 +166,8 @@ module.exports = {
         docs: {
             description: "disallow assignments where both sides are exactly the same",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-self-assign"
         },
 
         schema: [
diff --git a/lib/rules/no-self-compare.js b/lib/rules/no-self-compare.js
index 5beaa181b..6ebc3870f 100644
--- a/lib/rules/no-self-compare.js
+++ b/lib/rules/no-self-compare.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "disallow comparisons where both sides are exactly the same",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-self-compare"
         },
 
         schema: []
diff --git a/lib/rules/no-sequences.js b/lib/rules/no-sequences.js
index 5e746dfa8..8eaf55572 100644
--- a/lib/rules/no-sequences.js
+++ b/lib/rules/no-sequences.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow comma operators",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-sequences"
         },
 
         schema: []
diff --git a/lib/rules/no-shadow-restricted-names.js b/lib/rules/no-shadow-restricted-names.js
index 6c60232b8..7b92521b0 100644
--- a/lib/rules/no-shadow-restricted-names.js
+++ b/lib/rules/no-shadow-restricted-names.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow identifiers from shadowing restricted names",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-shadow-restricted-names"
         },
 
         schema: []
diff --git a/lib/rules/no-shadow.js b/lib/rules/no-shadow.js
index e093d48c8..d01231ff9 100644
--- a/lib/rules/no-shadow.js
+++ b/lib/rules/no-shadow.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "disallow variable declarations from shadowing variables declared in the outer scope",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-shadow"
         },
 
         schema: [
diff --git a/lib/rules/no-spaced-func.js b/lib/rules/no-spaced-func.js
index 361c1e0cd..42d1e4b24 100644
--- a/lib/rules/no-spaced-func.js
+++ b/lib/rules/no-spaced-func.js
@@ -16,7 +16,8 @@ module.exports = {
             description: "disallow spacing between function identifiers and their applications (deprecated)",
             category: "Stylistic Issues",
             recommended: false,
-            replacedBy: ["func-call-spacing"]
+            replacedBy: ["func-call-spacing"],
+            url: "https://eslint.org/docs/rules/no-spaced-func"
         },
 
         deprecated: true,
diff --git a/lib/rules/no-sparse-arrays.js b/lib/rules/no-sparse-arrays.js
index 3044896c6..1cc6f7ccb 100644
--- a/lib/rules/no-sparse-arrays.js
+++ b/lib/rules/no-sparse-arrays.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow sparse arrays",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-sparse-arrays"
         },
 
         schema: []
diff --git a/lib/rules/no-sync.js b/lib/rules/no-sync.js
index 06305969a..eb7b787d3 100644
--- a/lib/rules/no-sync.js
+++ b/lib/rules/no-sync.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow synchronous methods",
             category: "Node.js and CommonJS",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-sync"
         },
 
         schema: [
diff --git a/lib/rules/no-tabs.js b/lib/rules/no-tabs.js
index 4bab96f38..08a8fa5b7 100644
--- a/lib/rules/no-tabs.js
+++ b/lib/rules/no-tabs.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow all tabs",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-tabs"
         },
         schema: []
     },
diff --git a/lib/rules/no-template-curly-in-string.js b/lib/rules/no-template-curly-in-string.js
index d8f6c3110..ed74fcc6f 100644
--- a/lib/rules/no-template-curly-in-string.js
+++ b/lib/rules/no-template-curly-in-string.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow template literal placeholder syntax in regular strings",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-template-curly-in-string"
         },
 
         schema: []
diff --git a/lib/rules/no-ternary.js b/lib/rules/no-ternary.js
index 3e254f681..4dcc8db06 100644
--- a/lib/rules/no-ternary.js
+++ b/lib/rules/no-ternary.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow ternary operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-ternary"
         },
 
         schema: []
diff --git a/lib/rules/no-this-before-super.js b/lib/rules/no-this-before-super.js
index 2a686ac72..944a32352 100644
--- a/lib/rules/no-this-before-super.js
+++ b/lib/rules/no-this-before-super.js
@@ -39,7 +39,8 @@ module.exports = {
         docs: {
             description: "disallow `this`/`super` before calling `super()` in constructors",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-this-before-super"
         },
 
         schema: []
diff --git a/lib/rules/no-throw-literal.js b/lib/rules/no-throw-literal.js
index 5e9054399..b080578bf 100644
--- a/lib/rules/no-throw-literal.js
+++ b/lib/rules/no-throw-literal.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow throwing literals as exceptions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-throw-literal"
         },
 
         schema: []
diff --git a/lib/rules/no-trailing-spaces.js b/lib/rules/no-trailing-spaces.js
index fbbc64021..4d70c3b5c 100644
--- a/lib/rules/no-trailing-spaces.js
+++ b/lib/rules/no-trailing-spaces.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow trailing whitespace at the end of lines",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-trailing-spaces"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/no-undef-init.js b/lib/rules/no-undef-init.js
index 7e58f55a6..2e0ab2462 100644
--- a/lib/rules/no-undef-init.js
+++ b/lib/rules/no-undef-init.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow initializing variables to `undefined`",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-undef-init"
         },
 
         schema: [],
diff --git a/lib/rules/no-undef.js b/lib/rules/no-undef.js
index 74a33dd99..c8347d50d 100644
--- a/lib/rules/no-undef.js
+++ b/lib/rules/no-undef.js
@@ -28,7 +28,8 @@ module.exports = {
         docs: {
             description: "disallow the use of undeclared variables unless mentioned in `/*global */` comments",
             category: "Variables",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-undef"
         },
 
         schema: [
diff --git a/lib/rules/no-undefined.js b/lib/rules/no-undefined.js
index 7e9f96b92..94b514e91 100644
--- a/lib/rules/no-undefined.js
+++ b/lib/rules/no-undefined.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow the use of `undefined` as an identifier",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-undefined"
         },
 
         schema: []
diff --git a/lib/rules/no-underscore-dangle.js b/lib/rules/no-underscore-dangle.js
index 5964da41c..c76488a94 100644
--- a/lib/rules/no-underscore-dangle.js
+++ b/lib/rules/no-underscore-dangle.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow dangling underscores in identifiers",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-underscore-dangle"
         },
 
         schema: [
diff --git a/lib/rules/no-unexpected-multiline.js b/lib/rules/no-unexpected-multiline.js
index 9398b8a60..c7c26686d 100644
--- a/lib/rules/no-unexpected-multiline.js
+++ b/lib/rules/no-unexpected-multiline.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow confusing multiline expressions",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unexpected-multiline"
         },
 
         schema: []
diff --git a/lib/rules/no-unmodified-loop-condition.js b/lib/rules/no-unmodified-loop-condition.js
index 349baf11e..623144dc0 100644
--- a/lib/rules/no-unmodified-loop-condition.js
+++ b/lib/rules/no-unmodified-loop-condition.js
@@ -169,7 +169,8 @@ module.exports = {
         docs: {
             description: "disallow unmodified loop conditions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-unmodified-loop-condition"
         },
 
         schema: []
diff --git a/lib/rules/no-unneeded-ternary.js b/lib/rules/no-unneeded-ternary.js
index 574553780..7f82c8ee2 100644
--- a/lib/rules/no-unneeded-ternary.js
+++ b/lib/rules/no-unneeded-ternary.js
@@ -27,7 +27,8 @@ module.exports = {
         docs: {
             description: "disallow ternary operators when simpler alternatives exist",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-unneeded-ternary"
         },
 
         schema: [
diff --git a/lib/rules/no-unreachable.js b/lib/rules/no-unreachable.js
index 217a6a429..80d246307 100644
--- a/lib/rules/no-unreachable.js
+++ b/lib/rules/no-unreachable.js
@@ -104,7 +104,8 @@ module.exports = {
         docs: {
             description: "disallow unreachable code after `return`, `throw`, `continue`, and `break` statements",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unreachable"
         },
 
         schema: []
diff --git a/lib/rules/no-unsafe-finally.js b/lib/rules/no-unsafe-finally.js
index d25033e54..ebef05188 100644
--- a/lib/rules/no-unsafe-finally.js
+++ b/lib/rules/no-unsafe-finally.js
@@ -23,7 +23,8 @@ module.exports = {
         docs: {
             description: "disallow control flow statements in `finally` blocks",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unsafe-finally"
         },
 
         schema: []
diff --git a/lib/rules/no-unsafe-negation.js b/lib/rules/no-unsafe-negation.js
index 761dc0338..5dc39f183 100644
--- a/lib/rules/no-unsafe-negation.js
+++ b/lib/rules/no-unsafe-negation.js
@@ -44,7 +44,8 @@ module.exports = {
         docs: {
             description: "disallow negating the left operand of relational operators",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unsafe-negation"
         },
         schema: [],
         fixable: "code"
diff --git a/lib/rules/no-unused-expressions.js b/lib/rules/no-unused-expressions.js
index b4e1074d5..fedfac17d 100644
--- a/lib/rules/no-unused-expressions.js
+++ b/lib/rules/no-unused-expressions.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow unused expressions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-unused-expressions"
         },
 
         schema: [
diff --git a/lib/rules/no-unused-labels.js b/lib/rules/no-unused-labels.js
index bcd3cfdc4..3e1dcb660 100644
--- a/lib/rules/no-unused-labels.js
+++ b/lib/rules/no-unused-labels.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow unused labels",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unused-labels"
         },
 
         schema: [],
diff --git a/lib/rules/no-unused-vars.js b/lib/rules/no-unused-vars.js
index 05940d593..1d0cef856 100644
--- a/lib/rules/no-unused-vars.js
+++ b/lib/rules/no-unused-vars.js
@@ -21,7 +21,8 @@ module.exports = {
         docs: {
             description: "disallow unused variables",
             category: "Variables",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-unused-vars"
         },
 
         schema: [
@@ -105,26 +106,21 @@ module.exports = {
          * @returns {string} The warning message to be used with this unused variable.
          */
         function getDefinedMessage(unusedVar) {
+            const defType = unusedVar.defs && unusedVar.defs[0] && unusedVar.defs[0].type;
             let type;
             let pattern;
 
-            if (config.varsIgnorePattern) {
+            if (defType === "CatchClause" && config.caughtErrorsIgnorePattern) {
+                type = "args";
+                pattern = config.caughtErrorsIgnorePattern.toString();
+            } else if (defType === "Parameter" && config.argsIgnorePattern) {
+                type = "args";
+                pattern = config.argsIgnorePattern.toString();
+            } else if (defType !== "Parameter" && config.varsIgnorePattern) {
                 type = "vars";
                 pattern = config.varsIgnorePattern.toString();
             }
 
-            if (unusedVar.defs && unusedVar.defs[0] && unusedVar.defs[0].type) {
-                const defType = unusedVar.defs[0].type;
-
-                if (defType === "CatchClause" && config.caughtErrorsIgnorePattern) {
-                    type = "args";
-                    pattern = config.caughtErrorsIgnorePattern.toString();
-                } else if (defType === "Parameter" && config.argsIgnorePattern) {
-                    type = "args";
-                    pattern = config.argsIgnorePattern.toString();
-                }
-            }
-
             const additional = type ? ` Allowed unused ${type} must match ${pattern}.` : "";
 
             return `'{{name}}' is defined but never used.${additional}`;
diff --git a/lib/rules/no-use-before-define.js b/lib/rules/no-use-before-define.js
index ada01815d..37b8e11ca 100644
--- a/lib/rules/no-use-before-define.js
+++ b/lib/rules/no-use-before-define.js
@@ -139,7 +139,8 @@ module.exports = {
         docs: {
             description: "disallow the use of variables before they are defined",
             category: "Variables",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-use-before-define"
         },
 
         schema: [
diff --git a/lib/rules/no-useless-call.js b/lib/rules/no-useless-call.js
index e4820ac24..925c9f79a 100644
--- a/lib/rules/no-useless-call.js
+++ b/lib/rules/no-useless-call.js
@@ -52,7 +52,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary calls to `.call()` and `.apply()`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-call"
         },
 
         schema: []
diff --git a/lib/rules/no-useless-computed-key.js b/lib/rules/no-useless-computed-key.js
index f8114ab75..07573075e 100644
--- a/lib/rules/no-useless-computed-key.js
+++ b/lib/rules/no-useless-computed-key.js
@@ -21,7 +21,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary computed property keys in object literals",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-computed-key"
         },
 
         schema: [],
diff --git a/lib/rules/no-useless-concat.js b/lib/rules/no-useless-concat.js
index e42781fee..a9ac78684 100644
--- a/lib/rules/no-useless-concat.js
+++ b/lib/rules/no-useless-concat.js
@@ -69,7 +69,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary concatenation of literals or template literals",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-concat"
         },
 
         schema: []
diff --git a/lib/rules/no-useless-constructor.js b/lib/rules/no-useless-constructor.js
index f790c789f..59e40bef8 100644
--- a/lib/rules/no-useless-constructor.js
+++ b/lib/rules/no-useless-constructor.js
@@ -145,7 +145,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary constructors",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-constructor"
         },
 
         schema: []
diff --git a/lib/rules/no-useless-escape.js b/lib/rules/no-useless-escape.js
index cdc3e98df..80abec78e 100644
--- a/lib/rules/no-useless-escape.js
+++ b/lib/rules/no-useless-escape.js
@@ -82,7 +82,8 @@ module.exports = {
         docs: {
             description: "disallow unnecessary escape characters",
             category: "Best Practices",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/no-useless-escape"
         },
 
         schema: []
diff --git a/lib/rules/no-useless-rename.js b/lib/rules/no-useless-rename.js
index a489a6e51..83a03deb6 100644
--- a/lib/rules/no-useless-rename.js
+++ b/lib/rules/no-useless-rename.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow renaming import, export, and destructured assignments to the same name",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-rename"
         },
         fixable: "code",
         schema: [
diff --git a/lib/rules/no-useless-return.js b/lib/rules/no-useless-return.js
index 5415bf59b..8e2a6d97f 100644
--- a/lib/rules/no-useless-return.js
+++ b/lib/rules/no-useless-return.js
@@ -76,7 +76,8 @@ module.exports = {
         docs: {
             description: "disallow redundant return statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-useless-return"
         },
         fixable: "code",
         schema: []
diff --git a/lib/rules/no-var.js b/lib/rules/no-var.js
index d3c163e55..d95ca539f 100644
--- a/lib/rules/no-var.js
+++ b/lib/rules/no-var.js
@@ -183,7 +183,8 @@ module.exports = {
         docs: {
             description: "require `let` or `const` instead of `var`",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-var"
         },
 
         schema: [],
diff --git a/lib/rules/no-void.js b/lib/rules/no-void.js
index 5202fa49a..1d3d887da 100644
--- a/lib/rules/no-void.js
+++ b/lib/rules/no-void.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "disallow `void` operators",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-void"
         },
 
         schema: []
diff --git a/lib/rules/no-warning-comments.js b/lib/rules/no-warning-comments.js
index c0ecaca9e..ce58f9ac8 100644
--- a/lib/rules/no-warning-comments.js
+++ b/lib/rules/no-warning-comments.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "disallow specified warning terms in comments",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-warning-comments"
         },
 
         schema: [
diff --git a/lib/rules/no-whitespace-before-property.js b/lib/rules/no-whitespace-before-property.js
index 2d476b66c..fc4c25f84 100644
--- a/lib/rules/no-whitespace-before-property.js
+++ b/lib/rules/no-whitespace-before-property.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "disallow whitespace before properties",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-whitespace-before-property"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/no-with.js b/lib/rules/no-with.js
index be9e34636..d72dcdfb2 100644
--- a/lib/rules/no-with.js
+++ b/lib/rules/no-with.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "disallow `with` statements",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/no-with"
         },
 
         schema: []
diff --git a/lib/rules/nonblock-statement-body-position.js b/lib/rules/nonblock-statement-body-position.js
index 212e36a57..e447ef886 100644
--- a/lib/rules/nonblock-statement-body-position.js
+++ b/lib/rules/nonblock-statement-body-position.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce the location of single-line statements",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/nonblock-statement-body-position"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/object-curly-newline.js b/lib/rules/object-curly-newline.js
index ebad69de2..91b2ca6c9 100644
--- a/lib/rules/object-curly-newline.js
+++ b/lib/rules/object-curly-newline.js
@@ -97,7 +97,8 @@ module.exports = {
         docs: {
             description: "enforce consistent line breaks inside braces",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/object-curly-newline"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/object-curly-spacing.js b/lib/rules/object-curly-spacing.js
index 3341e915f..b37d6fd90 100644
--- a/lib/rules/object-curly-spacing.js
+++ b/lib/rules/object-curly-spacing.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing inside braces",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/object-curly-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/object-property-newline.js b/lib/rules/object-property-newline.js
index 0463e389a..56ca26940 100644
--- a/lib/rules/object-property-newline.js
+++ b/lib/rules/object-property-newline.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce placing object properties on separate lines",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/object-property-newline"
         },
 
         schema: [
diff --git a/lib/rules/object-shorthand.js b/lib/rules/object-shorthand.js
index 980d0fc35..c6c0b1044 100644
--- a/lib/rules/object-shorthand.js
+++ b/lib/rules/object-shorthand.js
@@ -27,7 +27,8 @@ module.exports = {
         docs: {
             description: "require or disallow method and property shorthand syntax for object literals",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/object-shorthand"
         },
 
         fixable: "code",
diff --git a/lib/rules/one-var-declaration-per-line.js b/lib/rules/one-var-declaration-per-line.js
index 61b505c82..e17529b6b 100644
--- a/lib/rules/one-var-declaration-per-line.js
+++ b/lib/rules/one-var-declaration-per-line.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "require or disallow newlines around variable declarations",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/one-var-declaration-per-line"
         },
 
         schema: [
diff --git a/lib/rules/one-var.js b/lib/rules/one-var.js
index 18e21d49b..cd094444b 100644
--- a/lib/rules/one-var.js
+++ b/lib/rules/one-var.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce variables to be declared either together or separately in functions",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/one-var"
         },
 
         schema: [
diff --git a/lib/rules/operator-assignment.js b/lib/rules/operator-assignment.js
index f776609f5..ad516bbfc 100644
--- a/lib/rules/operator-assignment.js
+++ b/lib/rules/operator-assignment.js
@@ -92,7 +92,8 @@ module.exports = {
         docs: {
             description: "require or disallow assignment operator shorthand where possible",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/operator-assignment"
         },
 
         schema: [
diff --git a/lib/rules/operator-linebreak.js b/lib/rules/operator-linebreak.js
index 271cbb35c..558258b27 100644
--- a/lib/rules/operator-linebreak.js
+++ b/lib/rules/operator-linebreak.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "enforce consistent linebreak style for operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/operator-linebreak"
         },
 
         schema: [
diff --git a/lib/rules/padded-blocks.js b/lib/rules/padded-blocks.js
index ad65882ac..2fbb26712 100644
--- a/lib/rules/padded-blocks.js
+++ b/lib/rules/padded-blocks.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require or disallow padding within blocks",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/padded-blocks"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/padding-line-between-statements.js b/lib/rules/padding-line-between-statements.js
index a89c49dec..9d1a4a3c7 100644
--- a/lib/rules/padding-line-between-statements.js
+++ b/lib/rules/padding-line-between-statements.js
@@ -394,7 +394,8 @@ module.exports = {
         docs: {
             description: "require or disallow padding lines between statements",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/padding-line-between-statements"
         },
         fixable: "whitespace",
         schema: {
diff --git a/lib/rules/prefer-arrow-callback.js b/lib/rules/prefer-arrow-callback.js
index 31ae2859f..ff7a0fa7e 100644
--- a/lib/rules/prefer-arrow-callback.js
+++ b/lib/rules/prefer-arrow-callback.js
@@ -134,7 +134,8 @@ module.exports = {
         docs: {
             description: "require using arrow functions for callbacks",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-arrow-callback"
         },
 
         schema: [
diff --git a/lib/rules/prefer-const.js b/lib/rules/prefer-const.js
index a8cf3b7ef..a24a00284 100644
--- a/lib/rules/prefer-const.js
+++ b/lib/rules/prefer-const.js
@@ -233,7 +233,8 @@ module.exports = {
         docs: {
             description: "require `const` declarations for variables that are never reassigned after declared",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-const"
         },
 
         fixable: "code",
diff --git a/lib/rules/prefer-destructuring.js b/lib/rules/prefer-destructuring.js
index 56c348a47..e9d02da3a 100644
--- a/lib/rules/prefer-destructuring.js
+++ b/lib/rules/prefer-destructuring.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "require destructuring from arrays and/or objects",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-destructuring"
         },
         schema: [
             {
diff --git a/lib/rules/prefer-numeric-literals.js b/lib/rules/prefer-numeric-literals.js
index 929e660c6..051a91c81 100644
--- a/lib/rules/prefer-numeric-literals.js
+++ b/lib/rules/prefer-numeric-literals.js
@@ -41,7 +41,8 @@ module.exports = {
         docs: {
             description: "disallow `parseInt()` and `Number.parseInt()` in favor of binary, octal, and hexadecimal literals",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-numeric-literals"
         },
 
         schema: [],
diff --git a/lib/rules/prefer-promise-reject-errors.js b/lib/rules/prefer-promise-reject-errors.js
index d2a6b5df1..f92bd58d2 100644
--- a/lib/rules/prefer-promise-reject-errors.js
+++ b/lib/rules/prefer-promise-reject-errors.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "require using Error objects as Promise rejection reasons",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-promise-reject-errors"
         },
         fixable: null,
         schema: [
diff --git a/lib/rules/prefer-reflect.js b/lib/rules/prefer-reflect.js
index a47e66c5f..56e841ff1 100644
--- a/lib/rules/prefer-reflect.js
+++ b/lib/rules/prefer-reflect.js
@@ -15,7 +15,8 @@ module.exports = {
             description: "require `Reflect` methods where applicable",
             category: "ECMAScript 6",
             recommended: false,
-            replacedBy: []
+            replacedBy: [],
+            url: "https://eslint.org/docs/rules/prefer-reflect"
         },
 
         deprecated: true,
diff --git a/lib/rules/prefer-rest-params.js b/lib/rules/prefer-rest-params.js
index 03342371b..133456e4d 100644
--- a/lib/rules/prefer-rest-params.js
+++ b/lib/rules/prefer-rest-params.js
@@ -65,7 +65,8 @@ module.exports = {
         docs: {
             description: "require rest parameters instead of `arguments`",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-rest-params"
         },
 
         schema: []
diff --git a/lib/rules/prefer-spread.js b/lib/rules/prefer-spread.js
index c111d5f98..62cfb28e7 100644
--- a/lib/rules/prefer-spread.js
+++ b/lib/rules/prefer-spread.js
@@ -52,7 +52,8 @@ module.exports = {
         docs: {
             description: "require spread operators instead of `.apply()`",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-spread"
         },
 
         schema: [],
diff --git a/lib/rules/prefer-template.js b/lib/rules/prefer-template.js
index 076ce6a3e..c583bdcf9 100644
--- a/lib/rules/prefer-template.js
+++ b/lib/rules/prefer-template.js
@@ -103,7 +103,8 @@ module.exports = {
         docs: {
             description: "require template literals instead of string concatenation",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/prefer-template"
         },
 
         schema: [],
diff --git a/lib/rules/quote-props.js b/lib/rules/quote-props.js
index 6ac1f3c13..36739494d 100644
--- a/lib/rules/quote-props.js
+++ b/lib/rules/quote-props.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "require quotes around object literal property names",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/quote-props"
         },
 
         schema: {
diff --git a/lib/rules/quotes.js b/lib/rules/quotes.js
index 914762727..fa8bbae5f 100644
--- a/lib/rules/quotes.js
+++ b/lib/rules/quotes.js
@@ -79,7 +79,8 @@ module.exports = {
         docs: {
             description: "enforce the consistent use of either backticks, double, or single quotes",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/quotes"
         },
 
         fixable: "code",
diff --git a/lib/rules/radix.js b/lib/rules/radix.js
index 0484c3bfb..7e116a6fb 100644
--- a/lib/rules/radix.js
+++ b/lib/rules/radix.js
@@ -81,7 +81,8 @@ module.exports = {
         docs: {
             description: "enforce the consistent use of the radix argument when using `parseInt()`",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/radix"
         },
 
         schema: [
diff --git a/lib/rules/require-await.js b/lib/rules/require-await.js
index a5698ae05..6adc84ae1 100644
--- a/lib/rules/require-await.js
+++ b/lib/rules/require-await.js
@@ -34,7 +34,8 @@ module.exports = {
         docs: {
             description: "disallow async functions which have no `await` expression",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/require-await"
         },
         schema: []
     },
diff --git a/lib/rules/require-jsdoc.js b/lib/rules/require-jsdoc.js
index a02ee3659..91b90b7d1 100644
--- a/lib/rules/require-jsdoc.js
+++ b/lib/rules/require-jsdoc.js
@@ -9,7 +9,8 @@ module.exports = {
         docs: {
             description: "require JSDoc comments",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/require-jsdoc"
         },
 
         schema: [
diff --git a/lib/rules/require-yield.js b/lib/rules/require-yield.js
index 5cc2944bc..83a29876f 100644
--- a/lib/rules/require-yield.js
+++ b/lib/rules/require-yield.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require generator functions to contain `yield`",
             category: "ECMAScript 6",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/require-yield"
         },
 
         schema: []
diff --git a/lib/rules/rest-spread-spacing.js b/lib/rules/rest-spread-spacing.js
index 91770eca7..1fbc2c4cc 100644
--- a/lib/rules/rest-spread-spacing.js
+++ b/lib/rules/rest-spread-spacing.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce spacing between rest and spread operators and their expressions",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/rest-spread-spacing"
         },
         fixable: "whitespace",
         schema: [
diff --git a/lib/rules/semi-spacing.js b/lib/rules/semi-spacing.js
index fd300e4a3..07af99376 100644
--- a/lib/rules/semi-spacing.js
+++ b/lib/rules/semi-spacing.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before and after semicolons",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/semi-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/semi-style.js b/lib/rules/semi-style.js
index 41fb39246..de6592813 100644
--- a/lib/rules/semi-style.js
+++ b/lib/rules/semi-style.js
@@ -68,7 +68,8 @@ module.exports = {
         docs: {
             description: "enforce location of semicolons",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/semi-style"
         },
         schema: [{ enum: ["last", "first"] }],
         fixable: "whitespace"
diff --git a/lib/rules/semi.js b/lib/rules/semi.js
index 78b6966de..33a214db7 100644
--- a/lib/rules/semi.js
+++ b/lib/rules/semi.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "require or disallow semicolons instead of ASI",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/semi"
         },
 
         fixable: "code",
diff --git a/lib/rules/sort-imports.js b/lib/rules/sort-imports.js
index 2bd415e97..8735be5d3 100644
--- a/lib/rules/sort-imports.js
+++ b/lib/rules/sort-imports.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "enforce sorted import declarations within modules",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/sort-imports"
         },
 
         schema: [
diff --git a/lib/rules/sort-keys.js b/lib/rules/sort-keys.js
index 8821f6294..9318e2fbb 100644
--- a/lib/rules/sort-keys.js
+++ b/lib/rules/sort-keys.js
@@ -76,7 +76,8 @@ module.exports = {
         docs: {
             description: "require object keys to be sorted",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/sort-keys"
         },
         schema: [
             {
diff --git a/lib/rules/sort-vars.js b/lib/rules/sort-vars.js
index c77cdf862..334deb065 100644
--- a/lib/rules/sort-vars.js
+++ b/lib/rules/sort-vars.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require variables within the same declaration block to be sorted",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/sort-vars"
         },
 
         schema: [
diff --git a/lib/rules/space-before-blocks.js b/lib/rules/space-before-blocks.js
index f50298c9c..2b82066d7 100644
--- a/lib/rules/space-before-blocks.js
+++ b/lib/rules/space-before-blocks.js
@@ -16,7 +16,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before blocks",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/space-before-blocks"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/space-before-function-paren.js b/lib/rules/space-before-function-paren.js
index 8851c4587..51f6cc432 100644
--- a/lib/rules/space-before-function-paren.js
+++ b/lib/rules/space-before-function-paren.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before `function` definition opening parenthesis",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/space-before-function-paren"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/space-in-parens.js b/lib/rules/space-in-parens.js
index 67ec5847c..7e315c448 100644
--- a/lib/rules/space-in-parens.js
+++ b/lib/rules/space-in-parens.js
@@ -15,7 +15,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing inside parentheses",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/space-in-parens"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/space-infix-ops.js b/lib/rules/space-infix-ops.js
index b92c889c7..49b64658d 100644
--- a/lib/rules/space-infix-ops.js
+++ b/lib/rules/space-infix-ops.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "require spacing around infix operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/space-infix-ops"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/space-unary-ops.js b/lib/rules/space-unary-ops.js
index 06a70fb6a..4d122836a 100644
--- a/lib/rules/space-unary-ops.js
+++ b/lib/rules/space-unary-ops.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing before or after unary operators",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/space-unary-ops"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/spaced-comment.js b/lib/rules/spaced-comment.js
index 8cdd05514..9d2f5f49a 100644
--- a/lib/rules/spaced-comment.js
+++ b/lib/rules/spaced-comment.js
@@ -158,7 +158,8 @@ module.exports = {
         docs: {
             description: "enforce consistent spacing after the `//` or `/*` in a comment",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/spaced-comment"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/strict.js b/lib/rules/strict.js
index 433b47136..633a8b323 100644
--- a/lib/rules/strict.js
+++ b/lib/rules/strict.js
@@ -83,7 +83,8 @@ module.exports = {
         docs: {
             description: "require or disallow strict mode directives",
             category: "Strict Mode",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/strict"
         },
 
         schema: [
diff --git a/lib/rules/switch-colon-spacing.js b/lib/rules/switch-colon-spacing.js
index 400e85099..cf19df6ed 100644
--- a/lib/rules/switch-colon-spacing.js
+++ b/lib/rules/switch-colon-spacing.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "enforce spacing around colons of switch statements",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/switch-colon-spacing"
         },
         schema: [
             {
diff --git a/lib/rules/symbol-description.js b/lib/rules/symbol-description.js
index 3f5ffd746..95c1a1deb 100644
--- a/lib/rules/symbol-description.js
+++ b/lib/rules/symbol-description.js
@@ -21,7 +21,8 @@ module.exports = {
         docs: {
             description: "require symbol descriptions",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/symbol-description"
         },
 
         schema: []
diff --git a/lib/rules/template-curly-spacing.js b/lib/rules/template-curly-spacing.js
index 1d491a24c..707ea76a3 100644
--- a/lib/rules/template-curly-spacing.js
+++ b/lib/rules/template-curly-spacing.js
@@ -27,7 +27,8 @@ module.exports = {
         docs: {
             description: "require or disallow spacing around embedded expressions of template strings",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/template-curly-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/template-tag-spacing.js b/lib/rules/template-tag-spacing.js
index 907c537ff..aee7ac108 100755
--- a/lib/rules/template-tag-spacing.js
+++ b/lib/rules/template-tag-spacing.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require or disallow spacing between template tags and their literals",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/template-tag-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/unicode-bom.js b/lib/rules/unicode-bom.js
index 7109a49ed..03b2d5ae6 100644
--- a/lib/rules/unicode-bom.js
+++ b/lib/rules/unicode-bom.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "require or disallow Unicode byte order mark (BOM)",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/unicode-bom"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/use-isnan.js b/lib/rules/use-isnan.js
index 5ec48a038..5bad5b3c6 100644
--- a/lib/rules/use-isnan.js
+++ b/lib/rules/use-isnan.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require calls to `isNaN()` when checking for `NaN`",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/use-isnan"
         },
 
         schema: []
diff --git a/lib/rules/valid-jsdoc.js b/lib/rules/valid-jsdoc.js
index ea60b115c..5e1af10de 100644
--- a/lib/rules/valid-jsdoc.js
+++ b/lib/rules/valid-jsdoc.js
@@ -19,7 +19,8 @@ module.exports = {
         docs: {
             description: "enforce valid JSDoc comments",
             category: "Possible Errors",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/valid-jsdoc"
         },
 
         schema: [
diff --git a/lib/rules/valid-typeof.js b/lib/rules/valid-typeof.js
index fba4cc571..ac4e74f20 100644
--- a/lib/rules/valid-typeof.js
+++ b/lib/rules/valid-typeof.js
@@ -13,7 +13,8 @@ module.exports = {
         docs: {
             description: "enforce comparing `typeof` expressions against valid strings",
             category: "Possible Errors",
-            recommended: true
+            recommended: true,
+            url: "https://eslint.org/docs/rules/valid-typeof"
         },
 
         schema: [
diff --git a/lib/rules/vars-on-top.js b/lib/rules/vars-on-top.js
index f74db905b..8f6bf1d97 100644
--- a/lib/rules/vars-on-top.js
+++ b/lib/rules/vars-on-top.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require `var` declarations be placed at the top of their containing scope",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/vars-on-top"
         },
 
         schema: []
diff --git a/lib/rules/wrap-iife.js b/lib/rules/wrap-iife.js
index c4e6a9e0c..a21bf2163 100644
--- a/lib/rules/wrap-iife.js
+++ b/lib/rules/wrap-iife.js
@@ -20,7 +20,8 @@ module.exports = {
         docs: {
             description: "require parentheses around immediate `function` invocations",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/wrap-iife"
         },
 
         schema: [
diff --git a/lib/rules/wrap-regex.js b/lib/rules/wrap-regex.js
index 79f3d3051..e58a4fe53 100644
--- a/lib/rules/wrap-regex.js
+++ b/lib/rules/wrap-regex.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require parenthesis around regex literals",
             category: "Stylistic Issues",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/wrap-regex"
         },
 
         schema: [],
diff --git a/lib/rules/yield-star-spacing.js b/lib/rules/yield-star-spacing.js
index eb20fc01b..33a37f0d9 100644
--- a/lib/rules/yield-star-spacing.js
+++ b/lib/rules/yield-star-spacing.js
@@ -14,7 +14,8 @@ module.exports = {
         docs: {
             description: "require or disallow spacing around the `*` in `yield*` expressions",
             category: "ECMAScript 6",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/yield-star-spacing"
         },
 
         fixable: "whitespace",
diff --git a/lib/rules/yoda.js b/lib/rules/yoda.js
index 2ccb61f73..7f3bc6115 100644
--- a/lib/rules/yoda.js
+++ b/lib/rules/yoda.js
@@ -155,7 +155,8 @@ module.exports = {
         docs: {
             description: "require or disallow \"Yoda\" conditions",
             category: "Best Practices",
-            recommended: false
+            recommended: false,
+            url: "https://eslint.org/docs/rules/yoda"
         },
 
         schema: [
diff --git a/tools/internal-rules/.eslintrc.yml b/tools/internal-rules/.eslintrc.yml
index 2a8d90793..64b3cee7f 100644
--- a/tools/internal-rules/.eslintrc.yml
+++ b/tools/internal-rules/.eslintrc.yml
@@ -1,3 +1,4 @@
 rules:
     rulesdir/no-invalid-meta: "error"
     rulesdir/consistent-docs-description: "error"
+    rulesdir/consistent-docs-url: "error"
diff --git a/tools/internal-rules/consistent-docs-description.js b/tools/internal-rules/consistent-docs-description.js
index 55e2a6c76..3120a0d81 100644
--- a/tools/internal-rules/consistent-docs-description.js
+++ b/tools/internal-rules/consistent-docs-description.js
@@ -104,7 +104,7 @@ function checkMetaDocsDescription(context, exportsNode) {
 
 module.exports = {
     meta: {
-        docs: {
+        docs: {// eslint-disable-line rulesdir/consistent-docs-url
             description: "enforce correct conventions of `meta.docs.description` property in core rules",
             category: "Internal",
             recommended: false
diff --git a/tools/internal-rules/consistent-docs-url.js b/tools/internal-rules/consistent-docs-url.js
new file mode 100644
index 000000000..b08783911
--- /dev/null
+++ b/tools/internal-rules/consistent-docs-url.js
@@ -0,0 +1,101 @@
+/**
+ * @fileoverview Internal rule to enforce meta.docs.url conventions.
+ * @author Patrick McElhaney
+ */
+
+"use strict";
+
+const path = require("path");
+
+//------------------------------------------------------------------------------
+// Helpers
+//------------------------------------------------------------------------------
+
+/**
+ * Gets the property of the Object node passed in that has the name specified.
+ *
+ * @param {string} property Name of the property to return.
+ * @param {ASTNode} node The ObjectExpression node.
+ * @returns {ASTNode} The Property node or null if not found.
+ */
+function getPropertyFromObject(property, node) {
+    const properties = node.properties;
+
+    for (let i = 0; i < properties.length; i++) {
+        if (properties[i].key.name === property) {
+            return properties[i];
+        }
+    }
+
+    return null;
+}
+
+/**
+ * Verifies that the meta.docs.url property is present and has the correct value.
+ *
+ * @param {RuleContext} context The ESLint rule context.
+ * @param {ASTNode} exportsNode ObjectExpression node that the rule exports.
+ * @returns {void}
+ */
+function checkMetaDocsUrl(context, exportsNode) {
+    if (exportsNode.type !== "ObjectExpression") {
+
+        // if the exported node is not the correct format, "internal-no-invalid-meta" will already report this.
+        return;
+    }
+
+    const metaProperty = getPropertyFromObject("meta", exportsNode);
+    const metaDocs = metaProperty && getPropertyFromObject("docs", metaProperty.value);
+    const metaDocsUrl = metaDocs && getPropertyFromObject("url", metaDocs.value);
+
+    if (!metaDocsUrl) {
+        context.report({
+            node: metaDocs,
+            message: "Rule is missing a meta.docs.url property"
+        });
+        return;
+    }
+
+    const ruleId = path.basename(context.getFilename().replace(/.js$/, ""));
+    const expected = `https://eslint.org/docs/rules/${ruleId}`;
+    const url = metaDocsUrl.value.value;
+
+    if (url !== expected) {
+        context.report({
+            node: metaDocsUrl.value,
+            message: `Incorrect url. Expected "${expected}" but got "${url}"`
+        });
+    }
+
+}
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+module.exports = {
+    meta: {
+        docs: {// eslint-disable-line rulesdir/consistent-docs-url
+            description: "enforce correct conventions of `meta.docs.url` property in core rules",
+            category: "Internal",
+            recommended: false
+        },
+
+        schema: []
+    },
+
+    create(context) {
+        return {
+            AssignmentExpression(node) {
+                if (node.left &&
+                    node.right &&
+                    node.left.type === "MemberExpression" &&
+                    node.left.object.name === "module" &&
+                    node.left.property.name === "exports") {
+
+                    checkMetaDocsUrl(context, node.right);
+                }
+            }
+        };
+    }
+};
diff --git a/tools/internal-rules/no-invalid-meta.js b/tools/internal-rules/no-invalid-meta.js
index 8082d1000..670cd0899 100644
--- a/tools/internal-rules/no-invalid-meta.js
+++ b/tools/internal-rules/no-invalid-meta.js
@@ -151,7 +151,7 @@ function isCorrectExportsFormat(node) {
 
 module.exports = {
     meta: {
-        docs: {
+        docs: {// eslint-disable-line rulesdir/consistent-docs-url
             description: "enforce correct use of `meta` property in core rules",
             category: "Internal",
             recommended: false


Test patch:
diff --git a/lib/testers/rule-tester.js b/lib/testers/rule-tester.js
index aae66301d..7e69c9619 100644
--- a/lib/testers/rule-tester.js
+++ b/lib/testers/rule-tester.js
@@ -131,13 +131,31 @@ const DESCRIBE = Symbol("describe");
 const IT = Symbol("it");
 
 /**
- * This is `it` or `describe` if those don't exist.
+ * This is `it` default handler if `it` don't exist.
  * @this {Mocha}
  * @param {string} text - The description of the test case.
  * @param {Function} method - The logic of the test case.
  * @returns {any} Returned value of `method`.
  */
-function defaultHandler(text, method) {
+function itDefaultHandler(text, method) {
+    try {
+        return method.apply(this);
+    } catch (err) {
+        if (err instanceof assert.AssertionError) {
+            err.message += ` (${util.inspect(err.actual)} ${err.operator} ${util.inspect(err.expected)})`;
+        }
+        throw err;
+    }
+}
+
+/**
+ * This is `describe` default handler if `describe` don't exist.
+ * @this {Mocha}
+ * @param {string} text - The description of the test case.
+ * @param {Function} method - The logic of the test case.
+ * @returns {any} Returned value of `method`.
+ */
+function describeDefaultHandler(text, method) {
     return method.apply(this);
 }
 
@@ -212,7 +230,7 @@ class RuleTester {
     static get describe() {
         return (
             this[DESCRIBE] ||
-            (typeof describe === "function" ? describe : defaultHandler)
+            (typeof describe === "function" ? describe : describeDefaultHandler)
         );
     }
 
@@ -223,7 +241,7 @@ class RuleTester {
     static get it() {
         return (
             this[IT] ||
-            (typeof it === "function" ? it : defaultHandler)
+            (typeof it === "function" ? it : itDefaultHandler)
         );
     }
 
diff --git a/tests/lib/cli-engine.js b/tests/lib/cli-engine.js
index ec5af55e7..48bc82f10 100644
--- a/tests/lib/cli-engine.js
+++ b/tests/lib/cli-engine.js
@@ -2935,6 +2935,15 @@ describe("CLIEngine", () => {
 
     });
 
+    describe("getRules()", () => {
+        it("should expose the list of rules", () => {
+            const engine = new CLIEngine();
+
+            assert.isTrue(engine.getRules().has("no-eval"), "no-eval is present");
+
+        });
+    });
+
     describe("resolveFileGlobPatterns", () => {
 
         leche.withData([
diff --git a/tests/lib/rules/no-extra-parens.js b/tests/lib/rules/no-extra-parens.js
index 7753c7d66..cab241a0a 100644
--- a/tests/lib/rules/no-extra-parens.js
+++ b/tests/lib/rules/no-extra-parens.js
@@ -145,7 +145,9 @@ ruleTester.run("no-extra-parens", rule, {
         "do; while(a);",
         "for(;;);",
         "for(a in b);",
+        "for(a in b, c);",
         "for(a of b);",
+        "for (a of (b, c));",
         "var a = (b, c);",
         "[]",
         "[a, b]",
@@ -1035,6 +1037,7 @@ ruleTester.run("no-extra-parens", rule, {
             "for (let.foo.bar in baz);",
             "Identifier",
             1
-        )
+        ),
+        invalid("for (a in (b, c));", "for (a in b, c);", "SequenceExpression", null)
     ]
 });
diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js
index 3e452ce3d..9615c62dd 100644
--- a/tests/lib/rules/no-unused-vars.js
+++ b/tests/lib/rules/no-unused-vars.js
@@ -675,6 +675,18 @@ ruleTester.run("no-unused-vars", rule, {
                 "'a' is defined but never used.",
                 "'c' is defined but never used."
             ]
+        },
+
+        // https://github.com/eslint/eslint/issues/9774
+        {
+            code: "(function(_a) {})();",
+            options: [{ args: "all", varsIgnorePattern: "^_" }],
+            errors: [{ message: "'_a' is defined but never used." }]
+        },
+        {
+            code: "(function(_a) {})();",
+            options: [{ args: "all", caughtErrorsIgnorePattern: "^_" }],
+            errors: [{ message: "'_a' is defined but never used." }]
         }
     ]
 });
diff --git a/tests/lib/testers/no-test-runners.js b/tests/lib/testers/no-test-runners.js
new file mode 100644
index 000000000..b77c6bb90
--- /dev/null
+++ b/tests/lib/testers/no-test-runners.js
@@ -0,0 +1,35 @@
+/**
+ * @fileoverview Tests for RuleTester without any test runner
+ * @author Weijia Wang <starkwang@126.com>
+ */
+"use strict";
+
+/* global describe, it */
+/* eslint-disable no-global-assign*/
+const assert = require("assert"),
+    RuleTester = require("../../../lib/testers/rule-tester");
+const tmpIt = it;
+const tmpDescribe = describe;
+
+it = null;
+describe = null;
+
+try {
+    const ruleTester = new RuleTester();
+
+    assert.throws(() => {
+        ruleTester.run("no-var", require("../../fixtures/testers/rule-tester/no-var"), {
+            valid: [
+                "bar = baz;"
+            ],
+            invalid: [
+                { code: "var foo = bar;", output: "invalid output", errors: 1 }
+            ]
+        });
+    }, /Output is incorrect\. \(' foo = bar;' == 'invalid output'\)$/);
+} catch (e) {
+    throw e;
+} finally {
+    it = tmpIt;
+    describe = tmpDescribe;
+}
diff --git a/tests/tools/internal-rules/consistent-docs-url.js b/tests/tools/internal-rules/consistent-docs-url.js
new file mode 100644
index 000000000..3d95dac06
--- /dev/null
+++ b/tests/tools/internal-rules/consistent-docs-url.js
@@ -0,0 +1,84 @@
+/**
+ * @fileoverview Tests for internal-consistent-docs-url rule.
+ * @author Patrick McElhaney
+ */
+
+"use strict";
+
+//------------------------------------------------------------------------------
+// Requirements
+//------------------------------------------------------------------------------
+
+const rule = require("../../../tools/internal-rules/consistent-docs-url"),
+    RuleTester = require("../../../lib/testers/rule-tester");
+
+//------------------------------------------------------------------------------
+// Tests
+//------------------------------------------------------------------------------
+
+const ruleTester = new RuleTester();
+
+ruleTester.run("consistent-docs-url", rule, {
+    valid: [
+
+        // wrong exports format: "internal-no-invalid-meta" reports this already
+        [
+            "module.exports = function(context) {",
+            "    return {",
+            "        Program: function(node) {}",
+            "    };",
+            "};"
+        ].join("\n"),
+        [
+            "module.exports = {",
+            "    meta: {",
+            "        docs: {",
+            "            url: 'https://eslint.org/docs/rules/<input>'",
+            "        }",
+            "    },",
+            "    create: function(context) {",
+            "        return {};",
+            "    }",
+            "};"
+        ].join("\n")
+    ],
+    invalid: [
+        {
+            code: [
+                "module.exports = {",
+                "    meta: {",
+                "        docs: {}",
+                "    },",
+
+                "    create: function(context) {",
+                "        return {};",
+                "    }",
+                "};"
+            ].join("\n"),
+            errors: [{
+                message: "Rule is missing a meta.docs.url property",
+                line: 3,
+                column: 9
+            }]
+        },
+        {
+            code: [
+                "module.exports = {",
+                "    meta: {",
+                "        docs: {",
+                "            url: 'http://example.com/wrong-url'",
+                "        }",
+                "    },",
+                "    create: function(context) {",
+                "        return {};",
+                "    }",
+                "};"
+            ].join("\n"),
+            errors: [{
+                message: "Incorrect url. Expected \"https://eslint.org/docs/rules/<input>\" but got \"http://example.com/wrong-url\"",
+                line: 4,
+                column: 18
+            }]
+        }
+    ]
+});