Repository: eslint/eslint
Pull request #10995 (2018-10-19 13:12:53)

Docs: Clarify the CLIEngine options
**What is the purpose of this pull request? (put an "X" next to item)**

[X] Documentation update

**What changes did you make? (Give an overview)**

This aims to prevent some of the common pitfalls/points of confusion when configuring `CLIEngine`, such as:
* it not being clear that `baseConfig` supports all of the options defined in the `.eslintrc.*` schema, and so can be used for options that are not supported as top-level `CLIEngine` arguments such as `extends` and `settings`.
* some of the CLIEngine options being named the same or almost the same as their `.eslintrc.*` equivalents, but being a different data type.
* it not being clear that CLIEngine silently ignores invalid options (which will hopefully be fixed at some point by #10272).

Refs:
#4402
#5179
#6605
#7247
#7967
#10272
webpack-contrib/eslint-loader#173
webpack-contrib/eslint-loader#252
neutrinojs/neutrino#1181

**Is there anything you'd like reviewers to focus on?**

Nothing specifically :-)


jsf-clabot: [![CLA assistant check](https://cla.js.foundation/pull/badge/not_signed)](https://cla.js.foundation/eslint/eslint?pullRequest=10995) <br/>Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you sign our [Contributor License Agreement](https://cla.js.foundation/eslint/eslint?pullRequest=10995) before we can accept your contribution.<br/>
edmorley: @platinumazure hi! Sorry for the delayed reply. I've tested locally and setting `globals` to `['foo:true']` works. I'll update the PR to mention that too.

Patch:
diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md
index a614d6b2f..1e9a73641 100644
--- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md
+++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md
@@ -1,6 +1,9 @@
 ---
 name: "\U0001F41E  Bug report"
 about: Report an issue with ESLint or rules bundled with ESLint
+title: ''
+labels: bug, evaluating
+assignees: ''
 
 ---
 
@@ -56,5 +59,3 @@ about: Report an issue with ESLint or rules bundled with ESLint
 
 
 **Are you willing to submit a pull request to fix this bug?**
-
-
diff --git a/.github/ISSUE_TEMPLATE/CHANGE.md b/.github/ISSUE_TEMPLATE/CHANGE.md
index 3fe2fe241..35cb70243 100644
--- a/.github/ISSUE_TEMPLATE/CHANGE.md
+++ b/.github/ISSUE_TEMPLATE/CHANGE.md
@@ -1,6 +1,9 @@
 ---
 name: "\U0001F4DD Non-rule change request"
 about: Request a change that is not a bug fix, rule change, or new rule
+title: ''
+labels: core, enhancement, evaluating
+assignees: ''
 
 ---
 
@@ -27,4 +30,3 @@ about: Request a change that is not a bug fix, rule change, or new rule
 
 
 **Are you willing to submit a pull request to implement this change?**
-
diff --git a/.github/ISSUE_TEMPLATE/NEW_RULE.md b/.github/ISSUE_TEMPLATE/NEW_RULE.md
index 5a50001b0..0fa62b1cf 100644
--- a/.github/ISSUE_TEMPLATE/NEW_RULE.md
+++ b/.github/ISSUE_TEMPLATE/NEW_RULE.md
@@ -1,6 +1,9 @@
 ---
-/name: "\U0001F680 New rule proposal"
+name: "\U0001F680 New rule proposal"
 about: Propose a new rule to be added to ESLint
+title: ''
+labels: rule, feature, evaluating
+assignees: ''
 
 ---
 
@@ -37,4 +40,3 @@ about: Propose a new rule to be added to ESLint
 
 
 **Are you willing to submit a pull request to implement this rule?**
-
diff --git a/.github/ISSUE_TEMPLATE/QUESTION.md b/.github/ISSUE_TEMPLATE/QUESTION.md
index ba96b4104..375e2170a 100644
--- a/.github/ISSUE_TEMPLATE/QUESTION.md
+++ b/.github/ISSUE_TEMPLATE/QUESTION.md
@@ -1,6 +1,9 @@
 ---
 name: "⛔ Question"
 about: Please go to https://gitter.im/eslint/eslint
+title: ''
+labels: ''
+assignees: ''
 
 ---
 
diff --git a/.github/ISSUE_TEMPLATE/RULE_CHANGE.md b/.github/ISSUE_TEMPLATE/RULE_CHANGE.md
index 9ecb2d002..88e250f96 100644
--- a/.github/ISSUE_TEMPLATE/RULE_CHANGE.md
+++ b/.github/ISSUE_TEMPLATE/RULE_CHANGE.md
@@ -1,6 +1,9 @@
 ---
 name: "\U0001F4DD Rule change request"
 about: Request a change to an existing rule
+title: ''
+labels: enhancement, evaluating, rule
+assignees: ''
 
 ---
 
@@ -34,4 +37,4 @@ about: Request a change to an existing rule
 
 **What will the rule do after it's changed?**
 
-**Are you willing to submit a pull request to implement this change?**
\ No newline at end of file
+**Are you willing to submit a pull request to implement this change?**
diff --git a/.github/ISSUE_TEMPLATE/SECURITY.md b/.github/ISSUE_TEMPLATE/SECURITY.md
index 8cc33ec6e..c04f52536 100644
--- a/.github/ISSUE_TEMPLATE/SECURITY.md
+++ b/.github/ISSUE_TEMPLATE/SECURITY.md
@@ -1,6 +1,9 @@
 ---
 name: "⛔ Security issue"
 about: Please file security issues at https://hackerone.com/eslint
+title: ''
+labels: ''
+assignees: ''
 
 ---
 
diff --git a/Makefile.js b/Makefile.js
index e468d0a16..eb2c586a7 100644
--- a/Makefile.js
+++ b/Makefile.js
@@ -350,7 +350,7 @@ function publishRelease() {
 /**
  * Splits a command result to separate lines.
  * @param {string} result The command result string.
- * @returns {array} The separated lines.
+ * @returns {Array} The separated lines.
  */
 function splitCommandResultToLines(result) {
     return result.trim().split("\n");
@@ -416,7 +416,7 @@ function getFirstVersionOfDeletion(filePath) {
 
 /**
  * Lints Markdown files.
- * @param {array} files Array of file names to lint.
+ * @param {Array} files Array of file names to lint.
  * @returns {Object} exec-style exit code object.
  * @private
  */
diff --git a/docs/developer-guide/nodejs-api.md b/docs/developer-guide/nodejs-api.md
index 834fecefd..7b9ecb6ec 100644
--- a/docs/developer-guide/nodejs-api.md
+++ b/docs/developer-guide/nodejs-api.md
@@ -339,17 +339,17 @@ var CLIEngine = require("eslint").CLIEngine;
 The `CLIEngine` is a constructor, and you can create a new instance by passing in the options you want to use. The available options are:
 
 * `allowInlineConfig` - Set to `false` to disable the use of configuration comments (such as `/*eslint-disable*/`). Corresponds to `--no-inline-config`.
-* `baseConfig` - Can optionally be set to a config object. This will used as a default config, and will be merged with any configuration defined in `.eslintrc.*` files, with the `.eslintrc.*` files having precedence.
+* `baseConfig` - Can optionally be set to a config object that has the same schema as `.eslintrc.*`. This will used as a default config, and will be merged with any configuration defined in `.eslintrc.*` files, with the `.eslintrc.*` files having precedence.
 * `cache` - Operate only on changed files (default: `false`). Corresponds to `--cache`.
 * `cacheFile` - Name of the file where the cache will be stored (default: `.eslintcache`). Corresponds to `--cache-file`. Deprecated: use `cacheLocation` instead.
 * `cacheLocation` - Name of the file or directory where the cache will be stored (default: `.eslintcache`). Corresponds to `--cache-location`.
 * `configFile` - The configuration file to use (default: null). If `useEslintrc` is true or not specified, this configuration will be merged with any configuration defined in `.eslintrc.*` files, with options in this configuration having precedence. Corresponds to `-c`.
 * `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.
+* `envs` - An array of environments to load (default: empty array). Corresponds to `--env`. Note: This differs from `.eslintrc.*` / `baseConfig`, where instead the option is called `env` and is an object.
+* `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, glob patterns or when using `executeOnText()`.
 * `fix` - A boolean or a function (default: `false`). If a function, it will be passed each linting message and should return a boolean indicating whether the fix should be included with the output report (errors and warnings will not be listed if fixed). Files on disk are never changed regardless of the value of `fix`. To persist changes to disk, call [`outputFixes()`](#cliengineoutputfixes).
 * `fixTypes` - An array of rule types for which fixes should be applied (default: `null`). This array acts like a filter, only allowing rules of the given types to apply fixes. Possible array values are `"problem"`, `"suggestion"`, and `"layout"`.
-* `globals` - An array of global variables to declare (default: empty array). Corresponds to `--global`.
+* `globals` - An array of global variables to declare (default: empty array). Corresponds to `--global`, and similarly supports passing `'name:true'` to denote a writeable global. Note: This differs from `.eslintrc.*` / `baseConfig`, where `globals` is an object.
 * `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`.
 * `ignorePattern` - Glob patterns for paths to ignore. String or array of strings.
@@ -362,7 +362,8 @@ The `CLIEngine` is a constructor, and you can create a new instance by passing i
 * `useEslintrc` - Set to false to disable use of `.eslintrc` files (default: true). Corresponds to `--no-eslintrc`.
 * `globInputPaths` - Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file.
 
-
+To programmatically set `.eslintrc.*` options not supported above (such as `extends`,
+`overrides` and `settings`), define them in a config object passed to `baseConfig` instead.
 
 For example:
 
@@ -370,6 +371,12 @@ For example:
 var CLIEngine = require("eslint").CLIEngine;
 
 var cli = new CLIEngine({
+    baseConfig: {
+        extends: ["eslint-config-shared"],
+        settings: {
+            sharedData: "Hello"
+        }
+    },
     envs: ["browser", "mocha"],
     useEslintrc: false,
     rules: {
@@ -378,7 +385,13 @@ 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.
+In this example, a new `CLIEngine` instance is created that extends a configuration called
+`"eslint-config-shared"`, a setting named `"sharedData"` and two environments (`"browser"`
+and `"mocha"`) are defined, loading of `.eslintrc` and `package.json` files are disabled,
+and the `semi` rule enabled as an error. You can then call methods on `cli` and these options
+will be used to perform the correct action.
+
+Note: Currently `CLIEngine` does not validate options passed to it, but may start doing so in the future.
 
 ### CLIEngine#executeOnFiles()
 
diff --git a/docs/rules/object-shorthand.md b/docs/rules/object-shorthand.md
index 6f2471faf..79e76655c 100644
--- a/docs/rules/object-shorthand.md
+++ b/docs/rules/object-shorthand.md
@@ -84,7 +84,7 @@ var foo = {
 
 See Also:
 
-- [`no-useless-rename`](https://eslint.org/docs/rules/object-shorthand) which disallows renaming import, export, and destructured assignments to the same name.
+- [`no-useless-rename`](https://eslint.org/docs/rules/no-useless-rename) which disallows renaming import, export, and destructured assignments to the same name.
 
 ## Options
 
diff --git a/lib/cli-engine.js b/lib/cli-engine.js
index 652d68b59..ce9fe289b 100644
--- a/lib/cli-engine.js
+++ b/lib/cli-engine.js
@@ -20,7 +20,7 @@ const fs = require("fs"),
     defaultOptions = require("../conf/default-cli-options"),
     Linter = require("./linter"),
     lodash = require("lodash"),
-    IgnoredPaths = require("./ignored-paths"),
+    IgnoredPaths = require("./util/ignored-paths"),
     Config = require("./config"),
     ConfigOps = require("./config/config-ops"),
     LintResultCache = require("./util/lint-result-cache"),
diff --git a/lib/config.js b/lib/config.js
index 8ea9aeb6f..abcb38b50 100644
--- a/lib/config.js
+++ b/lib/config.js
@@ -15,8 +15,7 @@ const path = require("path"),
     ConfigFile = require("./config/config-file"),
     ConfigCache = require("./config/config-cache"),
     Plugins = require("./config/plugins"),
-    FileFinder = require("./util/file-finder"),
-    isResolvable = require("is-resolvable");
+    FileFinder = require("./util/file-finder");
 
 const debug = require("debug")("eslint:config");
 
@@ -41,6 +40,20 @@ function hasRules(options) {
     return options.rules && Object.keys(options.rules).length > 0;
 }
 
+/**
+ * Determines if a module is can be resolved.
+ * @param {string} moduleId The ID (name) of the module
+ * @returns {boolean} True if it is resolvable; False otherwise.
+ */
+function isResolvable(moduleId) {
+    try {
+        require.resolve(moduleId);
+        return true;
+    } catch (err) {
+        return false;
+    }
+}
+
 //------------------------------------------------------------------------------
 // API
 //------------------------------------------------------------------------------
diff --git a/lib/config/autoconfig.js b/lib/config/autoconfig.js
index 8536fdc55..f2c707be8 100644
--- a/lib/config/autoconfig.js
+++ b/lib/config/autoconfig.js
@@ -102,7 +102,6 @@ class Registry {
      *
      * The length of the returned array will be <= MAX_CONFIG_COMBINATIONS.
      *
-     * @param   {Object}   registry The autoconfig registry
      * @returns {Object[]}          "rules" configurations to use for linting
      */
     buildRuleSets() {
diff --git a/lib/config/config-rule.js b/lib/config/config-rule.js
index 27d29446d..e4221406d 100644
--- a/lib/config/config-rule.js
+++ b/lib/config/config-rule.js
@@ -37,9 +37,9 @@ function explodeArray(xs) {
  * For example:
  * combineArrays([a, [b, c]], [x, y]); // -> [[a, x], [a, y], [b, c, x], [b, c, y]]
  *
- * @param   {array} arr1 The first array to combine.
- * @param   {array} arr2 The second array to combine.
- * @returns {array}      A mixture of the elements of the first and second arrays.
+ * @param   {Array} arr1 The first array to combine.
+ * @param   {Array} arr2 The second array to combine.
+ * @returns {Array}      A mixture of the elements of the first and second arrays.
  */
 function combineArrays(arr1, arr2) {
     const res = [];
@@ -268,7 +268,7 @@ class RuleConfigSet {
 /**
  * Generate valid rule configurations based on a schema object
  * @param   {Object} schema  A rule's schema object
- * @returns {array[]}        Valid rule configurations
+ * @returns {Array[]}        Valid rule configurations
  */
 function generateConfigsFromSchema(schema) {
     const configSet = new RuleConfigSet();
diff --git a/lib/config/config-validator.js b/lib/config/config-validator.js
index 6b151f46a..0c63b68f7 100644
--- a/lib/config/config-validator.js
+++ b/lib/config/config-validator.js
@@ -83,7 +83,7 @@ function validateRuleSeverity(options) {
 /**
  * Validates the non-severity options passed to a rule, based on its schema.
  * @param {{create: Function}} rule The rule to validate
- * @param {array} localOptions The options for the rule, excluding severity
+ * @param {Array} localOptions The options for the rule, excluding severity
  * @returns {void}
  */
 function validateRuleSchema(rule, localOptions) {
@@ -111,7 +111,7 @@ function validateRuleSchema(rule, localOptions) {
  * Validates a rule's options against its schema.
  * @param {{create: Function}|null} rule The rule that the config is being validated for
  * @param {string} ruleId The rule's unique name.
- * @param {array|number} options The given options for the rule.
+ * @param {Array|number} options The given options for the rule.
  * @param {string|null} source The name of the configuration source to report in any errors. If null or undefined,
  * no source is prepended to the message.
  * @returns {void}
diff --git a/lib/linter.js b/lib/linter.js
index 84a53784a..d6d635f9f 100644
--- a/lib/linter.js
+++ b/lib/linter.js
@@ -21,7 +21,7 @@ const eslintScope = require("eslint-scope"),
     NodeEventGenerator = require("./util/node-event-generator"),
     SourceCode = require("./util/source-code"),
     Traverser = require("./util/traverser"),
-    createReportTranslator = require("./report-translator"),
+    createReportTranslator = require("./util/report-translator"),
     Rules = require("./rules"),
     timing = require("./util/timing"),
     ConfigCommentParser = require("./util/config-comment-parser"),
@@ -922,8 +922,6 @@ module.exports = class Linter {
      * @param {(string|Object)} [filenameOrOptions] The optional filename of the file being checked.
      *      If this is not set, the filename will default to '<input>' in the rule context. If
      *      an object, then it has "filename", "saveState", and "allowInlineConfig" properties.
-     * @param {boolean} [saveState] Indicates if the state from the last run should be saved.
-     *      Mostly useful for testing purposes.
      * @param {boolean} [filenameOrOptions.allowInlineConfig] Allow/disallow inline comments' ability to change config once it is set. Defaults to true if not supplied.
      *      Useful if you want to validate JS without comments overriding rules.
      * @param {function(string): string[]} [filenameOrOptions.preprocess] preprocessor for source text. If provided,
diff --git a/lib/rules/array-element-newline.js b/lib/rules/array-element-newline.js
index 440290917..dadb26fdd 100644
--- a/lib/rules/array-element-newline.js
+++ b/lib/rules/array-element-newline.js
@@ -173,7 +173,6 @@ module.exports = {
          * Reports a given node if it violated this rule.
          *
          * @param {ASTNode} node - A node to check. This is an ObjectExpression node or an ObjectPattern node.
-         * @param {{multiline: boolean, minItems: number}} options - An option object.
          * @returns {void}
          */
         function check(node) {
diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js
index 8aeb4b5bd..6fb8760f1 100644
--- a/lib/rules/camelcase.js
+++ b/lib/rules/camelcase.js
@@ -132,9 +132,10 @@ module.exports = {
 
                 /*
                  * Leading and trailing underscores are commonly used to flag
-                 * private/protected identifiers, strip them
+                 * private/protected identifiers, strip them before checking if underscored
                  */
-                const name = node.name.replace(/^_+|_+$/g, ""),
+                const name = node.name,
+                    nameIsUnderscored = isUnderscored(name.replace(/^_+|_+$/g, "")),
                     effectiveParent = (node.parent.type === "MemberExpression") ? node.parent.parent : node.parent;
 
                 // First, we ignore the node if it match the ignore list
@@ -151,11 +152,11 @@ module.exports = {
                     }
 
                     // Always report underscored object names
-                    if (node.parent.object.type === "Identifier" && node.parent.object.name === node.name && isUnderscored(name)) {
+                    if (node.parent.object.type === "Identifier" && node.parent.object.name === node.name && nameIsUnderscored) {
                         report(node);
 
                     // Report AssignmentExpressions only if they are the left side of the assignment
-                    } else if (effectiveParent.type === "AssignmentExpression" && isUnderscored(name) && (effectiveParent.right.type !== "MemberExpression" || effectiveParent.left.type === "MemberExpression" && effectiveParent.left.property.name === node.name)) {
+                    } else if (effectiveParent.type === "AssignmentExpression" && nameIsUnderscored && (effectiveParent.right.type !== "MemberExpression" || effectiveParent.left.type === "MemberExpression" && effectiveParent.left.property.name === node.name)) {
                         report(node);
                     }
 
@@ -167,7 +168,7 @@ module.exports = {
                 } else if (node.parent.type === "Property" || node.parent.type === "AssignmentPattern") {
 
                     if (node.parent.parent && node.parent.parent.type === "ObjectPattern") {
-                        if (node.parent.shorthand && node.parent.value.left && isUnderscored(name)) {
+                        if (node.parent.shorthand && node.parent.value.left && nameIsUnderscored) {
 
                             report(node);
                         }
@@ -179,7 +180,7 @@ module.exports = {
                             return;
                         }
 
-                        const valueIsUnderscored = node.parent.value.name && isUnderscored(name);
+                        const valueIsUnderscored = node.parent.value.name && nameIsUnderscored;
 
                         // ignore destructuring if the option is set, unless a new identifier is created
                         if (valueIsUnderscored && !(assignmentKeyEqualsValue && ignoreDestructuring)) {
@@ -193,7 +194,7 @@ module.exports = {
                     }
 
                     // don't check right hand side of AssignmentExpression to prevent duplicate warnings
-                    if (isUnderscored(name) && !ALLOWED_PARENT_TYPES.has(effectiveParent.type) && !(node.parent.right === node)) {
+                    if (nameIsUnderscored && !ALLOWED_PARENT_TYPES.has(effectiveParent.type) && !(node.parent.right === node)) {
                         report(node);
                     }
 
@@ -201,12 +202,12 @@ module.exports = {
                 } else if (["ImportSpecifier", "ImportNamespaceSpecifier", "ImportDefaultSpecifier"].indexOf(node.parent.type) >= 0) {
 
                     // Report only if the local imported identifier is underscored
-                    if (node.parent.local && node.parent.local.name === node.name && isUnderscored(name)) {
+                    if (node.parent.local && node.parent.local.name === node.name && nameIsUnderscored) {
                         report(node);
                     }
 
                 // Report anything that is underscored that isn't a CallExpression
-                } else if (isUnderscored(name) && !ALLOWED_PARENT_TYPES.has(effectiveParent.type)) {
+                } else if (nameIsUnderscored && !ALLOWED_PARENT_TYPES.has(effectiveParent.type)) {
                     report(node);
                 }
             }
diff --git a/lib/rules/comma-style.js b/lib/rules/comma-style.js
index 2586cf66e..78438a858 100644
--- a/lib/rules/comma-style.js
+++ b/lib/rules/comma-style.js
@@ -85,7 +85,7 @@ module.exports = {
         function getReplacedText(styleType, text) {
             switch (styleType) {
                 case "between":
-                    return `,${text.replace("\n", "")}`;
+                    return `,${text.replace(astUtils.LINEBREAK_MATCHER, "")}`;
 
                 case "first":
                     return `${text},`;
@@ -138,6 +138,11 @@ module.exports = {
             } else if (!astUtils.isTokenOnSameLine(commaToken, currentItemToken) &&
                     !astUtils.isTokenOnSameLine(previousItemToken, commaToken)) {
 
+                const comment = sourceCode.getCommentsAfter(commaToken)[0];
+                const styleType = comment && comment.type === "Block" && astUtils.isTokenOnSameLine(commaToken, comment)
+                    ? style
+                    : "between";
+
                 // lone comma
                 context.report({
                     node: reportItem,
@@ -146,7 +151,7 @@ module.exports = {
                         column: commaToken.loc.start.column
                     },
                     messageId: "unexpectedLineBeforeAndAfterComma",
-                    fix: getFixerFunction("between", previousItemToken, commaToken, currentItemToken)
+                    fix: getFixerFunction(styleType, previousItemToken, commaToken, currentItemToken)
                 });
 
             } else if (style === "first" && !astUtils.isTokenOnSameLine(commaToken, currentItemToken)) {
diff --git a/lib/rules/eqeqeq.js b/lib/rules/eqeqeq.js
index 715c5ce7c..3e8a392cf 100644
--- a/lib/rules/eqeqeq.js
+++ b/lib/rules/eqeqeq.js
@@ -119,7 +119,6 @@ module.exports = {
         /**
          * Gets the location (line and column) of the binary expression's operator
          * @param {ASTNode} node The binary expression node to check
-         * @param {string} operator The operator to find
          * @returns {Object} { line, column } location of operator
          * @private
          */
diff --git a/lib/rules/handle-callback-err.js b/lib/rules/handle-callback-err.js
index c62016d58..5845aff4b 100644
--- a/lib/rules/handle-callback-err.js
+++ b/lib/rules/handle-callback-err.js
@@ -59,7 +59,7 @@ module.exports = {
         /**
          * Get the parameters of a given function scope.
          * @param {Object} scope The function scope.
-         * @returns {array} All parameters of the given scope.
+         * @returns {Array} All parameters of the given scope.
          */
         function getParameters(scope) {
             return scope.variables.filter(variable => variable.defs[0] && variable.defs[0].type === "Parameter");
diff --git a/lib/rules/implicit-arrow-linebreak.js b/lib/rules/implicit-arrow-linebreak.js
index cd729f8ad..a883b2264 100644
--- a/lib/rules/implicit-arrow-linebreak.js
+++ b/lib/rules/implicit-arrow-linebreak.js
@@ -44,7 +44,6 @@ module.exports = {
         /**
          * Validates the location of an arrow function body
          * @param {ASTNode} node The arrow function body
-         * @param {string} keywordName The applicable keyword name for the arrow function body
          * @returns {void}
          */
         function validateExpression(node) {
diff --git a/lib/rules/indent-legacy.js b/lib/rules/indent-legacy.js
index 16687b521..cfb807e34 100644
--- a/lib/rules/indent-legacy.js
+++ b/lib/rules/indent-legacy.js
@@ -300,7 +300,6 @@ module.exports = {
          * @param {int} gottenTabs Indentation tab count in the actual node/code
          * @param {Object=} loc Error line and column location
          * @param {boolean} isLastNodeCheck Is the error for last node check
-         * @param {int} lastNodeCheckEndOffset Number of charecters to skip from the end
          * @returns {void}
          */
         function report(node, needed, gottenSpaces, gottenTabs, loc, isLastNodeCheck) {
@@ -365,7 +364,6 @@ module.exports = {
          * Check indent for node
          * @param {ASTNode} node Node to check
          * @param {int} neededIndent needed indent
-         * @param {boolean} [excludeCommas=false] skip comma on start of line
          * @returns {void}
          */
         function checkNodeIndent(node, neededIndent) {
@@ -413,7 +411,6 @@ module.exports = {
          * Check indent for nodes list
          * @param {ASTNode[]} nodes list of node objects
          * @param {int} indent needed indent
-         * @param {boolean} [excludeCommas=false] skip comma on start of line
          * @returns {void}
          */
         function checkNodesIndent(nodes, indent) {
diff --git a/lib/rules/keyword-spacing.js b/lib/rules/keyword-spacing.js
index 66ce2cb34..790d7b031 100644
--- a/lib/rules/keyword-spacing.js
+++ b/lib/rules/keyword-spacing.js
@@ -453,6 +453,10 @@ module.exports = {
             checkSpacingBefore(firstToken, PREV_TOKEN_M);
             checkSpacingAfter(firstToken, NEXT_TOKEN_M);
 
+            if (node.type === "ExportDefaultDeclaration") {
+                checkSpacingAround(sourceCode.getTokenAfter(firstToken));
+            }
+
             if (node.source) {
                 const fromToken = sourceCode.getTokenBefore(node.source);
 
@@ -554,7 +558,7 @@ module.exports = {
             // Statements - Declarations
             ClassDeclaration: checkSpacingForClass,
             ExportNamedDeclaration: checkSpacingForModuleDeclaration,
-            ExportDefaultDeclaration: checkSpacingAroundFirstToken,
+            ExportDefaultDeclaration: checkSpacingForModuleDeclaration,
             ExportAllDeclaration: checkSpacingForModuleDeclaration,
             FunctionDeclaration: checkSpacingForFunction,
             ImportDeclaration: checkSpacingForModuleDeclaration,
diff --git a/lib/rules/newline-before-return.js b/lib/rules/newline-before-return.js
index 2743bf7a8..6a0ec8d5e 100644
--- a/lib/rules/newline-before-return.js
+++ b/lib/rules/newline-before-return.js
@@ -36,7 +36,7 @@ module.exports = {
         /**
          * Tests whether node is preceded by supplied tokens
          * @param {ASTNode} node - node to check
-         * @param {array} testTokens - array of tokens to test against
+         * @param {Array} testTokens - array of tokens to test against
          * @returns {boolean} Whether or not the node is preceded by one of the supplied tokens
          * @private
          */
diff --git a/lib/rules/no-constant-condition.js b/lib/rules/no-constant-condition.js
index 88984c36e..8d7934d8a 100644
--- a/lib/rules/no-constant-condition.js
+++ b/lib/rules/no-constant-condition.js
@@ -173,7 +173,6 @@ module.exports = {
 
         /**
          * Reports when the set still contains stored constant conditions
-         * @param {ASTNode} node The AST node to check.
          * @returns {void}
          * @private
          */
diff --git a/lib/rules/no-else-return.js b/lib/rules/no-else-return.js
index eebdec76e..5ba02de29 100644
--- a/lib/rules/no-else-return.js
+++ b/lib/rules/no-else-return.js
@@ -183,7 +183,6 @@ module.exports = {
          * code paths.
          *
          * @param {Node} node The consequent or body node
-         * @param {Node} alternate The alternate node
          * @returns {boolean} `true` if it is a Return/If node that always returns.
          */
         function checkForReturnOrIf(node) {
diff --git a/lib/rules/no-implied-eval.js b/lib/rules/no-implied-eval.js
index d31b5dfee..afa24ab8e 100644
--- a/lib/rules/no-implied-eval.js
+++ b/lib/rules/no-implied-eval.js
@@ -38,7 +38,7 @@ module.exports = {
 
         /**
          * Get the last element of an array, without modifying arr, like pop(), but non-destructive.
-         * @param {array} arr What to inspect
+         * @param {Array} arr What to inspect
          * @returns {*} The last element of arr
          * @private
          */
diff --git a/lib/rules/no-restricted-imports.js b/lib/rules/no-restricted-imports.js
index b8fcca1aa..b8917ee9c 100644
--- a/lib/rules/no-restricted-imports.js
+++ b/lib/rules/no-restricted-imports.js
@@ -195,7 +195,7 @@ module.exports = {
         /**
          * Check if the given importNames are restricted given a list of restrictedImportNames.
          * @param {Set.<string>} importNames - Set of import names that are being imported
-         * @param {[string]} restrictedImportNames - array of import names that are restricted for this import
+         * @param {string[]} restrictedImportNames - array of import names that are restricted for this import
          * @returns {boolean} whether the objectName is restricted
          * @private
          */
diff --git a/lib/rules/no-this-before-super.js b/lib/rules/no-this-before-super.js
index 93fb094e9..bca379bf9 100644
--- a/lib/rules/no-this-before-super.js
+++ b/lib/rules/no-this-before-super.js
@@ -171,7 +171,6 @@ module.exports = {
              * invalid node.
              *
              * @param {CodePath} codePath - A code path which was ended.
-             * @param {ASTNode} node - The current node.
              * @returns {void}
              */
             onCodePathEnd(codePath) {
diff --git a/lib/rules/object-curly-newline.js b/lib/rules/object-curly-newline.js
index c460ea56b..d1a6bc20f 100644
--- a/lib/rules/object-curly-newline.js
+++ b/lib/rules/object-curly-newline.js
@@ -172,7 +172,6 @@ module.exports = {
         /**
          * Reports a given node if it violated this rule.
          * @param {ASTNode} node - A node to check. This is an ObjectExpression, ObjectPattern, ImportDeclaration or ExportNamedDeclaration node.
-         * @param {{multiline: boolean, minProperties: number, consistent: boolean}} options - An option object.
          * @returns {void}
          */
         function check(node) {
diff --git a/lib/rules/one-var.js b/lib/rules/one-var.js
index 44f05fb70..0e9dff416 100644
--- a/lib/rules/one-var.js
+++ b/lib/rules/one-var.js
@@ -310,7 +310,6 @@ module.exports = {
         /**
          * Fixer to split a VariableDeclaration into individual declarations
          * @param   {VariableDeclaration}   declaration The `VariableDeclaration` to split
-         * @param   {?Function}             filter      Function to filter the declarations
          * @returns {Function}                          The fixer function
          */
         function splitDeclarations(declaration) {
diff --git a/lib/rules/quotes.js b/lib/rules/quotes.js
index e0db17fcb..c3c077822 100644
--- a/lib/rules/quotes.js
+++ b/lib/rules/quotes.js
@@ -228,6 +228,34 @@ module.exports = {
             }
         }
 
+        /**
+         * Checks whether or not a given TemplateLiteral node is actually using any of the special features provided by template literal strings.
+         * @param {ASTNode} node - A TemplateLiteral node to check.
+         * @returns {boolean} Whether or not the TemplateLiteral node is using any of the special features provided by template literal strings.
+         * @private
+         */
+        function isUsingFeatureOfTemplateLiteral(node) {
+            const hasTag = node.parent.type === "TaggedTemplateExpression" && node === node.parent.quasi;
+
+            if (hasTag) {
+                return true;
+            }
+
+            const hasStringInterpolation = node.expressions.length > 0;
+
+            if (hasStringInterpolation) {
+                return true;
+            }
+
+            const isMultilineString = node.quasis.length >= 1 && UNESCAPED_LINEBREAK_PATTERN.test(node.quasis[0].value.raw);
+
+            if (isMultilineString) {
+                return true;
+            }
+
+            return false;
+        }
+
         return {
 
             Literal(node) {
@@ -260,39 +288,34 @@ module.exports = {
 
             TemplateLiteral(node) {
 
-                // If backticks are expected or it's a tagged template, then this shouldn't throw an errors
+                // Don't throw an error if backticks are expected or a template literal feature is in use.
                 if (
                     allowTemplateLiterals ||
                     quoteOption === "backtick" ||
-                    node.parent.type === "TaggedTemplateExpression" && node === node.parent.quasi
+                    isUsingFeatureOfTemplateLiteral(node)
                 ) {
                     return;
                 }
 
-                // A warning should be produced if the template literal only has one TemplateElement, and has no unescaped newlines.
-                const shouldWarn = node.quasis.length === 1 && !UNESCAPED_LINEBREAK_PATTERN.test(node.quasis[0].value.raw);
-
-                if (shouldWarn) {
-                    context.report({
-                        node,
-                        message: "Strings must use {{description}}.",
-                        data: {
-                            description: settings.description
-                        },
-                        fix(fixer) {
-                            if (isPartOfDirectivePrologue(node)) {
-
-                                /*
-                                 * TemplateLiterals in a directive prologue aren't actually directives, but if they're
-                                 * in the directive prologue, then fixing them might turn them into directives and change
-                                 * the behavior of the code.
-                                 */
-                                return null;
-                            }
-                            return fixer.replaceText(node, settings.convert(sourceCode.getText(node)));
+                context.report({
+                    node,
+                    message: "Strings must use {{description}}.",
+                    data: {
+                        description: settings.description
+                    },
+                    fix(fixer) {
+                        if (isPartOfDirectivePrologue(node)) {
+
+                            /*
+                             * TemplateLiterals in a directive prologue aren't actually directives, but if they're
+                             * in the directive prologue, then fixing them might turn them into directives and change
+                             * the behavior of the code.
+                             */
+                            return null;
                         }
-                    });
-                }
+                        return fixer.replaceText(node, settings.convert(sourceCode.getText(node)));
+                    }
+                });
             }
         };
 
diff --git a/lib/rules/require-jsdoc.js b/lib/rules/require-jsdoc.js
index 949314993..389bfb692 100644
--- a/lib/rules/require-jsdoc.js
+++ b/lib/rules/require-jsdoc.js
@@ -43,7 +43,10 @@ module.exports = {
                 },
                 additionalProperties: false
             }
-        ]
+        ],
+
+        deprecated: true,
+        replacedBy: []
     },
 
     create(context) {
diff --git a/lib/rules/space-in-parens.js b/lib/rules/space-in-parens.js
index 88f4f0b50..306866263 100644
--- a/lib/rules/space-in-parens.js
+++ b/lib/rules/space-in-parens.js
@@ -61,7 +61,6 @@ module.exports = {
 
         /**
          * Produces an object with the opener and closer exception values
-         * @param {Object} opts The exception options
          * @returns {Object} `openers` and `closers` exception values
          * @private
          */
diff --git a/lib/rules/valid-jsdoc.js b/lib/rules/valid-jsdoc.js
index b434491bf..b40a20f6b 100644
--- a/lib/rules/valid-jsdoc.js
+++ b/lib/rules/valid-jsdoc.js
@@ -64,7 +64,10 @@ module.exports = {
             }
         ],
 
-        fixable: "code"
+        fixable: "code",
+
+        deprecated: true,
+        replacedBy: []
     },
 
     create(context) {
diff --git a/lib/util/glob-utils.js b/lib/util/glob-utils.js
index a2be0f042..fd4cfa008 100644
--- a/lib/util/glob-utils.js
+++ b/lib/util/glob-utils.js
@@ -14,7 +14,7 @@ const lodash = require("lodash"),
     GlobSync = require("./glob"),
 
     pathUtils = require("./path-utils"),
-    IgnoredPaths = require("../ignored-paths");
+    IgnoredPaths = require("./ignored-paths");
 
 const debug = require("debug")("eslint:glob-utils");
 
diff --git a/lib/ignored-paths.js b/lib/util/ignored-paths.js
similarity index 98%
rename from lib/ignored-paths.js
rename to lib/util/ignored-paths.js
index 8520090af..de4a79cde 100644
--- a/lib/ignored-paths.js
+++ b/lib/util/ignored-paths.js
@@ -12,7 +12,7 @@
 const fs = require("fs"),
     path = require("path"),
     ignore = require("ignore"),
-    pathUtils = require("./util/path-utils");
+    pathUtils = require("./path-utils");
 
 const debug = require("debug")("eslint:ignored-paths");
 
@@ -296,7 +296,7 @@ class IgnoredPaths {
     /**
      * read ignore filepath
      * @param {string} filePath, file to add to ig
-     * @returns {array} raw ignore rules
+     * @returns {Array} raw ignore rules
      */
     readIgnoreFile(filePath) {
         if (typeof this.cache[filePath] === "undefined") {
@@ -307,8 +307,8 @@ class IgnoredPaths {
 
     /**
      * add ignore file to node-ignore instance
-     * @param {Object} ig, instance of node-ignore
-     * @param {string} filePath, file to add to ig
+     * @param {Object} ig instance of node-ignore
+     * @param {string} filePath file to add to ig
      * @returns {void}
      */
     addIgnoreFile(ig, filePath) {
diff --git a/lib/report-translator.js b/lib/util/report-translator.js
similarity index 99%
rename from lib/report-translator.js
rename to lib/util/report-translator.js
index f82830586..3dfdca0e4 100644
--- a/lib/report-translator.js
+++ b/lib/util/report-translator.js
@@ -10,8 +10,8 @@
 //------------------------------------------------------------------------------
 
 const assert = require("assert");
-const ruleFixer = require("./util/rule-fixer");
-const interpolate = require("./util/interpolate");
+const ruleFixer = require("./rule-fixer");
+const interpolate = require("./interpolate");
 
 //------------------------------------------------------------------------------
 // Typedefs
diff --git a/lib/util/source-code.js b/lib/util/source-code.js
index 765fde725..4e90ac1aa 100644
--- a/lib/util/source-code.js
+++ b/lib/util/source-code.js
@@ -316,6 +316,7 @@ class SourceCode extends TokenStore {
      * @returns {Token|null} The Block comment token containing the JSDoc comment
      *      for the given node or null if not found.
      * @public
+     * @deprecated
      */
     getJSDocComment(node) {
 
diff --git a/package.json b/package.json
index c64318d0b..441828725 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,7 @@
     "eslint-scope": "^4.0.0",
     "eslint-utils": "^1.3.1",
     "eslint-visitor-keys": "^1.0.0",
-    "espree": "^4.0.0",
+    "espree": "^5.0.0",
     "esquery": "^1.0.1",
     "esutils": "^2.0.2",
     "file-entry-cache": "^2.0.0",
@@ -54,7 +54,6 @@
     "ignore": "^4.0.6",
     "imurmurhash": "^0.1.4",
     "inquirer": "^6.1.0",
-    "is-resolvable": "^1.1.0",
     "js-yaml": "^3.12.0",
     "json-stable-stringify-without-jsonify": "^1.0.1",
     "levn": "^0.3.0",
diff --git a/packages/eslint-config-eslint/default.yml b/packages/eslint-config-eslint/default.yml
index 30444d640..42ce7b1ec 100644
--- a/packages/eslint-config-eslint/default.yml
+++ b/packages/eslint-config-eslint/default.yml
@@ -181,6 +181,7 @@ rules:
             "String": "string",
             "Number": "number",
             "Boolean": "boolean",
+            "array": "Array",
             "object": "Object",
             "function": "Function"
         }


Test patch:
diff --git a/tests/lib/cli-engine.js b/tests/lib/cli-engine.js
index d5b0b3728..9a57e86df 100644
--- a/tests/lib/cli-engine.js
+++ b/tests/lib/cli-engine.js
@@ -733,6 +733,7 @@ describe("CLIEngine", () => {
         it("should warn when deprecated rules are found in a config", () => {
             engine = new CLIEngine({
                 cwd: originalDir,
+                useEslintrc: false,
                 configFile: "tests/fixtures/cli-engine/deprecated-rule-config/.eslintrc.yml"
             });
 
@@ -1530,7 +1531,11 @@ describe("CLIEngine", () => {
 
             assert.deepStrictEqual(
                 report.usedDeprecatedRules,
-                [{ ruleId: "indent-legacy", replacedBy: ["indent"] }]
+                [
+                    { ruleId: "indent-legacy", replacedBy: ["indent"] },
+                    { ruleId: "require-jsdoc", replacedBy: [] },
+                    { ruleId: "valid-jsdoc", replacedBy: [] }
+                ]
             );
         });
 
@@ -1538,7 +1543,7 @@ describe("CLIEngine", () => {
             engine = new CLIEngine({
                 cwd: originalDir,
                 configFile: ".eslintrc.js",
-                rules: { indent: 1 }
+                rules: { indent: 1, "valid-jsdoc": 0, "require-jsdoc": 0 }
             });
 
             const report = engine.executeOnFiles(["lib/cli*.js"]);
@@ -1549,7 +1554,8 @@ describe("CLIEngine", () => {
         it("should warn when deprecated rules are found in a config", () => {
             engine = new CLIEngine({
                 cwd: originalDir,
-                configFile: "tests/fixtures/cli-engine/deprecated-rule-config/.eslintrc.yml"
+                configFile: "tests/fixtures/cli-engine/deprecated-rule-config/.eslintrc.yml",
+                useEslintrc: false
             });
 
             const report = engine.executeOnFiles(["lib/cli*.js"]);
diff --git a/tests/lib/rules/camelcase.js b/tests/lib/rules/camelcase.js
index 3d2b7516c..d1ce3b3fd 100644
--- a/tests/lib/rules/camelcase.js
+++ b/tests/lib/rules/camelcase.js
@@ -193,6 +193,10 @@ ruleTester.run("camelcase", rule, {
         {
             code: "user_id = 0;",
             options: [{ allow: ["_id$"] }]
+        },
+        {
+            code: "__option_foo__ = 0;",
+            options: [{ allow: ["__option_foo__"] }]
         }
     ],
     invalid: [
diff --git a/tests/lib/rules/comma-style.js b/tests/lib/rules/comma-style.js
index 83a1ca2c9..a63d80ae8 100644
--- a/tests/lib/rules/comma-style.js
+++ b/tests/lib/rules/comma-style.js
@@ -612,6 +612,13 @@ ruleTester.run("comma-style", rule, {
             code: "[\n[foo(3)],\n,\nbar\n];",
             output: "[\n[foo(3)],,\nbar\n];",
             errors: [{ messageId: "unexpectedLineBeforeAndAfterComma" }]
+        },
+        {
+
+            // https://github.com/eslint/eslint/issues/10632
+            code: "[foo//\n,/*block\ncomment*/];",
+            output: "[foo,//\n/*block\ncomment*/];",
+            errors: [{ messageId: "unexpectedLineBeforeAndAfterComma" }]
         }
     ]
 });
diff --git a/tests/lib/rules/indent-legacy.js b/tests/lib/rules/indent-legacy.js
index 17a1f62a4..3e3a21684 100644
--- a/tests/lib/rules/indent-legacy.js
+++ b/tests/lib/rules/indent-legacy.js
@@ -24,7 +24,7 @@ const fixedFixture = fs.readFileSync(path.join(__dirname, "../../fixtures/rules/
 /**
  * Create error message object for failure cases with a single 'found' indentation type
  * @param {string} providedIndentType indent type of string or tab
- * @param {array} providedErrors error info
+ * @param {Array} providedErrors error info
  * @returns {Object} returns the error messages collection
  * @private
  */
diff --git a/tests/lib/rules/indent.js b/tests/lib/rules/indent.js
index 07e025f30..8f20a8ea8 100644
--- a/tests/lib/rules/indent.js
+++ b/tests/lib/rules/indent.js
@@ -25,7 +25,7 @@ const parser = require("../../fixtures/fixture-parser");
 /**
  * Create error message object for failure cases with a single 'found' indentation type
  * @param {string} providedIndentType indent type of string or tab
- * @param {array} providedErrors error info
+ * @param {Array} providedErrors error info
  * @returns {Object} returns the error messages collection
  * @private
  */
diff --git a/tests/lib/rules/keyword-spacing.js b/tests/lib/rules/keyword-spacing.js
index 33a9d5068..cebd16367 100644
--- a/tests/lib/rules/keyword-spacing.js
+++ b/tests/lib/rules/keyword-spacing.js
@@ -2023,6 +2023,12 @@ ruleTester.run("keyword-spacing", rule, {
             parserOptions: { sourceType: "module" },
             errors: expectedBefore("export")
         },
+        {
+            code: "export default{a}",
+            output: "export default {a}",
+            parserOptions: { sourceType: "module" },
+            errors: expectedAfter("default")
+        },
         {
             code: "{}export* from \"a\"",
             output: "{} export * from \"a\"",
diff --git a/tests/lib/rules/no-empty-function.js b/tests/lib/rules/no-empty-function.js
index 416a47da6..21f1bdae0 100644
--- a/tests/lib/rules/no-empty-function.js
+++ b/tests/lib/rules/no-empty-function.js
@@ -31,9 +31,9 @@ const ALLOW_OPTIONS = Object.freeze([
  * Folds test items to `{valid: [], invalid: []}`.
  * One item would be converted to 4 valid patterns and 8 invalid patterns.
  *
- * @param {{valid: object[], invalid: object[]}} patterns - The result.
+ * @param {{valid: Object[], invalid: Object[]}} patterns - The result.
  * @param {{code: string, message: string, allow: string}} item - A test item.
- * @returns {{valid: object[], invalid: object[]}} The result.
+ * @returns {{valid: Object[], invalid: Object[]}} The result.
  */
 function toValidInvalid(patterns, item) {
 
diff --git a/tests/lib/ignored-paths.js b/tests/lib/util/ignored-paths.js
similarity index 99%
rename from tests/lib/ignored-paths.js
rename to tests/lib/util/ignored-paths.js
index b03314e61..acf007b18 100644
--- a/tests/lib/ignored-paths.js
+++ b/tests/lib/util/ignored-paths.js
@@ -12,7 +12,7 @@
 const assert = require("chai").assert,
     path = require("path"),
     os = require("os"),
-    IgnoredPaths = require("../../lib/ignored-paths.js"),
+    IgnoredPaths = require("../../../lib/util/ignored-paths.js"),
     sinon = require("sinon"),
     fs = require("fs"),
     includes = require("lodash").includes;
@@ -29,7 +29,7 @@ let fixtureDir;
 
 /**
  * get raw rules from IgnorePaths instance
- * @param {IgnoredPaths} ignoredPaths, instance of IgnoredPaths
+ * @param {IgnoredPaths} ignoredPaths instance of IgnoredPaths
  * @returns {string[]} raw ignore rules
  */
 function getIgnoreRules(ignoredPaths) {
@@ -78,7 +78,7 @@ function getIgnorePatterns(ignoredPaths) {
 
 /**
  * count the number of default patterns applied to IgnoredPaths instance
- * @param {IgnoredPaths} ignoredPaths, instance of IgnoredPaths
+ * @param {IgnoredPaths} ignoredPaths instance of IgnoredPaths
  * @returns {integer} count of default patterns
  */
 function countDefaultPatterns(ignoredPaths) {
diff --git a/tests/lib/report-translator.js b/tests/lib/util/report-translator.js
similarity index 99%
rename from tests/lib/report-translator.js
rename to tests/lib/util/report-translator.js
index e009e4e82..cd600934d 100644
--- a/tests/lib/report-translator.js
+++ b/tests/lib/util/report-translator.js
@@ -9,9 +9,9 @@
 //------------------------------------------------------------------------------
 
 const assert = require("chai").assert;
-const SourceCode = require("../../lib/util/source-code");
+const SourceCode = require("../../../lib/util/source-code");
 const espree = require("espree");
-const createReportTranslator = require("../../lib/report-translator");
+const createReportTranslator = require("../../../lib/util/report-translator");
 
 //------------------------------------------------------------------------------
 // Tests