From 18ab35df41d8ffcb22348b914c511fe850219462 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 3 Apr 2020 22:01:59 -0400 Subject: [PATCH] Add dry-error-messages rule --- .../babel-eslint-plugin-internal/package.json | 1 - .../babel-eslint-plugin-internal/src/index.js | 7 + .../src/rules/dry-error-messages.js | 144 +++++ .../test/rules/dry-error-messages.js | 605 +++++++++++++++++- eslint/babel-eslint-plugin/package.json | 1 - .../test/rules/object-curly-spacing.js | 7 +- .../babel-eslint-shared-fixtures/package.json | 1 + .../utils/RuleTester.js | 2 + 8 files changed, 758 insertions(+), 10 deletions(-) diff --git a/eslint/babel-eslint-plugin-internal/package.json b/eslint/babel-eslint-plugin-internal/package.json index 4a942379b0f4..d88ec5f0366a 100644 --- a/eslint/babel-eslint-plugin-internal/package.json +++ b/eslint/babel-eslint-plugin-internal/package.json @@ -30,7 +30,6 @@ "eslint": ">=6.0.0" }, "devDependencies": { - "@babel/eslint-parser": "*", "@babel/eslint-shared-fixtures": "*", "eslint": "^6.0.0" } diff --git a/eslint/babel-eslint-plugin-internal/src/index.js b/eslint/babel-eslint-plugin-internal/src/index.js index e69de29bb2d1..9db11d20c651 100644 --- a/eslint/babel-eslint-plugin-internal/src/index.js +++ b/eslint/babel-eslint-plugin-internal/src/index.js @@ -0,0 +1,7 @@ +import dryErrorMessages from "./rules/dry-error-messages"; + +export default { + rules: { + "dry-error-messages": dryErrorMessages, + }, +}; diff --git a/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js index e69de29bb2d1..8a89181742f7 100644 --- a/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js @@ -0,0 +1,144 @@ +import path from "path"; + +const REL_PATH_REGEX = /^\.{1,2}/; + +function isRelativePath(filePath) { + return REL_PATH_REGEX.test(filePath); +} + +function normalizeSrcExt(source) { + return !path.extname(source) ? `${source}.js` : source; +} + +function isErrorModule(targetModulePath, currentFilePath, src) { + if (isRelativePath(src)) { + return ( + path.normalize(targetModulePath) === + path.normalize( + normalizeSrcExt(path.resolve(path.dirname(currentFilePath), src)), + ) + ); + } + + return targetModulePath === src; +} + +function findIdNode(node) { + if (node.type === "Identifier") { + return node; + } + + if (node.type === "MemberExpression" && node.object.type === "Identifier") { + return node.object; + } + + return null; +} + +function findReference(scope, node) { + let currScope = scope; + + while (currScope) { + const ref = currScope.set.get(node.name); + + if (ref) { + return ref; + } + + currScope = currScope.upper; + } + + return null; +} + +function referencesImportedBinding(node, scope, bindings) { + const ref = findReference(scope, node); + + if (ref) { + const topLevelDef = ref.defs[0]; + + if (topLevelDef.type === "ImportBinding") { + const defNode = topLevelDef.node; + + for (const spec of bindings) { + if ( + spec.loc.start === defNode.loc.start && + spec.loc.end === defNode.loc.end + ) { + return true; + } + } + } + } + + return false; +} + +export default { + meta: { + type: "suggestion", + docs: { + description: + "enforce @babel/parser's error messages to be consolidated in one module", + }, + schema: [ + { + type: "object", + properties: { + errorModule: { type: "string" }, + }, + additionalProperties: false, + }, + ], + messages: { + mustBeImported: 'Error messages must be imported from "{{errorModule}}".', + }, + }, + create({ options = {}, report, getFilename, getScope }) { + const [{ errorModule } = {}] = options; + const filename = getFilename(); + const importedBindings = new Set(); + + return { + // Check imports up front so that we don't have to check them for every ThrowStatement. + ImportDeclaration(node) { + if (isErrorModule(errorModule, filename, node.source.value)) { + for (const spec of node.specifiers) { + importedBindings.add(spec); + } + } + }, + "ThrowStatement[argument.type='CallExpression'] [callee.type='MemberExpression']"( + node, + ) { + if ( + node.callee.object?.type !== "ThisExpression" || + node.callee.property?.name !== "raise" + ) { + return; + } + + // Ignore malformed `this.raise()` calls. + if (node.arguments.length < 2) { + return; + } + + const [, errorMsgNode] = node.arguments; + const nodeToCheck = findIdNode(errorMsgNode); + + if ( + nodeToCheck && + referencesImportedBinding(nodeToCheck, getScope(), importedBindings) + ) { + return; + } + + report({ + node: errorMsgNode, + messageId: "mustBeImported", + data: { errorModule }, + }); + }, + }; + }, +}; diff --git a/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js index 3be2db5f4811..4c42e5b0b2ed 100644 --- a/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js @@ -1,9 +1,610 @@ +import path from "path"; import rule from "../../src/rules/dry-error-messages"; import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; +const FILENAME = path.resolve(__dirname, "test/lib/index.js"); +const ERRORS_MODULE = "errorsModule"; +const MODULE_SAME_DIR = path.resolve(__dirname, "test/lib/errorsModule.js"); +const MODULE_PARENT_DIR = path.resolve(__dirname, "test/errorsModule.js"); + const ruleTester = new RuleTester(); ruleTester.run("dry-error-messages", rule, { - valid: [], - invalid: [], + valid: [ + "this.raise(loc);", // Ignores malformed `this.raise` invocations. + "this.notRaise(loc, 'Uh oh');", + "throw new Error(this.raise('Uh oh'));", + "this.raise(() => { throw new Error('Uh oh') });", + "throw new Error('Uh oh')", + "throw this.createError('Uh oh')", + { + filename: FILENAME, + code: + "import { Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import { Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import { Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import { Errors } from 'errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import { Errors } from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import { Errors } from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from 'errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import Errors from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors from 'errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import Errors from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from 'errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from 'errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + }, + ], + invalid: [ + { + filename: FILENAME, + code: "throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "const Errors = { someErrorMessage: 'Uh oh!' }; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from 'errorsModule'; throw this.raise(loc, 'Uh oh!');", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from 'errorsModule'; const msg = 'Uh oh!'; throw this.raise(loc, msg);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import { NotErrors, Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import Errors, { NotErrors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_SAME_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_SAME_DIR }, + }, + ], + }, + { + filename: FILENAME, + code: + "import NotErrors, { Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + options: [{ errorModule: MODULE_PARENT_DIR }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: MODULE_PARENT_DIR }, + }, + ], + }, + ], }); diff --git a/eslint/babel-eslint-plugin/package.json b/eslint/babel-eslint-plugin/package.json index 89eeb3974a61..4a37d9106796 100644 --- a/eslint/babel-eslint-plugin/package.json +++ b/eslint/babel-eslint-plugin/package.json @@ -33,7 +33,6 @@ "eslint-rule-composer": "^0.3.0" }, "devDependencies": { - "@babel/eslint-parser": "*", "@babel/eslint-shared-fixtures": "*", "eslint": "^6.0.0", "lodash.clonedeep": "^4.5.0" diff --git a/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js b/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js index 0ce725bf748e..1c3e270582e7 100644 --- a/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js +++ b/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js @@ -3,11 +3,6 @@ import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; const ruleTester = new RuleTester(); ruleTester.run("@babel/object-curly-spacing", rule, { - valid: [ - { - code: 'export x from "mod";', - }, - ], - + valid: ['export x from "mod";'], invalid: [], }); diff --git a/eslint/babel-eslint-shared-fixtures/package.json b/eslint/babel-eslint-shared-fixtures/package.json index 96bbb96dde67..1946669fe5c4 100644 --- a/eslint/babel-eslint-shared-fixtures/package.json +++ b/eslint/babel-eslint-shared-fixtures/package.json @@ -5,6 +5,7 @@ "license": "MIT", "private": true, "dependencies": { + "@babel/eslint-parser": "*", "@babel/plugin-proposal-class-properties": "^7.1.0", "@babel/plugin-proposal-decorators": "^7.1.2", "@babel/plugin-proposal-do-expressions": "^7.7.4", diff --git a/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js b/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js index 1f1883fd41eb..58be2ff8d47e 100644 --- a/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js +++ b/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js @@ -4,6 +4,8 @@ const { RuleTester } = require("eslint"); RuleTester.setDefaultConfig({ parser: require.resolve("@babel/eslint-parser"), parserOptions: { + sourceType: "module", + ecmaVersion: 11, babelOptions: { configFile: require.resolve( path.join(__dirname, "../config/babel.config.js")