From b1f7899ec84a93001e02a1508ab4814adf6ca9e7 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 3 Apr 2020 19:09:36 -0400 Subject: [PATCH 01/14] Add @babel/eslint-plugin-internal --- .../babel-eslint-plugin-internal/.npmignore | 4 ++ eslint/babel-eslint-plugin-internal/README.md | 0 .../babel-eslint-plugin-internal/package.json | 37 +++++++++++++++++++ .../babel-eslint-plugin-internal/src/index.js | 0 .../src/rules/dry-error-messages.js | 0 .../test/rules/dry-error-messages.js | 9 +++++ eslint/babel-eslint-plugin/package.json | 2 +- .../babel-eslint-plugin/test/rules/new-cap.js | 2 +- .../test/rules/no-invalid-this.js | 2 +- .../test/rules/no-unused-expressions.js | 2 +- .../test/rules/object-curly-spacing.js | 2 +- eslint/babel-eslint-plugin/test/rules/semi.js | 2 +- .../utils}/RuleTester.js | 7 ++-- 13 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 eslint/babel-eslint-plugin-internal/.npmignore create mode 100644 eslint/babel-eslint-plugin-internal/README.md create mode 100644 eslint/babel-eslint-plugin-internal/package.json create mode 100644 eslint/babel-eslint-plugin-internal/src/index.js create mode 100644 eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js create mode 100644 eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js rename eslint/{babel-eslint-plugin/test/helpers => babel-eslint-shared-fixtures/utils}/RuleTester.js (53%) diff --git a/eslint/babel-eslint-plugin-internal/.npmignore b/eslint/babel-eslint-plugin-internal/.npmignore new file mode 100644 index 000000000000..ad69326ce8c2 --- /dev/null +++ b/eslint/babel-eslint-plugin-internal/.npmignore @@ -0,0 +1,4 @@ +src +test +.* +*.log diff --git a/eslint/babel-eslint-plugin-internal/README.md b/eslint/babel-eslint-plugin-internal/README.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/eslint/babel-eslint-plugin-internal/package.json b/eslint/babel-eslint-plugin-internal/package.json new file mode 100644 index 000000000000..4a942379b0f4 --- /dev/null +++ b/eslint/babel-eslint-plugin-internal/package.json @@ -0,0 +1,37 @@ +{ + "name": "@babel/eslint-plugin-internal", + "version": "0.0.0", + "description": "The Babel Team's ESLint custom rules plugin. Since it's internal, it might not respect semver.", + "main": "lib/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/babel/babel.git", + "directory": "eslint/babel-eslint-plugin-internal" + }, + "keywords": [ + "babel", + "eslint", + "eslintplugin", + "eslint-plugin", + "babel-eslint" + ], + "author": "Kai Cataldo =10.9" + }, + "bugs": { + "url": "https://github.com/babel/babel/issues" + }, + "homepage": "https://github.com/babel/babel/tree/master/eslint/babel-eslint-plugin-internal", + "peerDependencies": { + "@babel/eslint-parser": "0.0.0", + "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 new file mode 100644 index 000000000000..e69de29bb2d1 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 new file mode 100644 index 000000000000..e69de29bb2d1 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 new file mode 100644 index 000000000000..3be2db5f4811 --- /dev/null +++ b/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js @@ -0,0 +1,9 @@ +import rule from "../../src/rules/dry-error-messages"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; + +const ruleTester = new RuleTester(); + +ruleTester.run("dry-error-messages", rule, { + valid: [], + invalid: [], +}); diff --git a/eslint/babel-eslint-plugin/package.json b/eslint/babel-eslint-plugin/package.json index 8d9134a40d18..1332ae4a9e63 100644 --- a/eslint/babel-eslint-plugin/package.json +++ b/eslint/babel-eslint-plugin/package.json @@ -33,8 +33,8 @@ "eslint-rule-composer": "^0.3.0" }, "devDependencies": { - "@babel/eslint-shared-fixtures": "*", "@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/new-cap.js b/eslint/babel-eslint-plugin/test/rules/new-cap.js index d5e44984152e..669c51ee5765 100644 --- a/eslint/babel-eslint-plugin/test/rules/new-cap.js +++ b/eslint/babel-eslint-plugin/test/rules/new-cap.js @@ -1,5 +1,5 @@ import rule from "../../src/rules/new-cap"; -import RuleTester from "../helpers/RuleTester"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; const ruleTester = new RuleTester(); ruleTester.run("@babel/new-cap", rule, { diff --git a/eslint/babel-eslint-plugin/test/rules/no-invalid-this.js b/eslint/babel-eslint-plugin/test/rules/no-invalid-this.js index 7fdde00b7227..47cd9d89ad10 100644 --- a/eslint/babel-eslint-plugin/test/rules/no-invalid-this.js +++ b/eslint/babel-eslint-plugin/test/rules/no-invalid-this.js @@ -1,6 +1,6 @@ import cloneDeep from "lodash.clonedeep"; import rule from "../../src/rules/no-invalid-this"; -import RuleTester from "../helpers/RuleTester"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; /** * A constant value for non strict mode environment. diff --git a/eslint/babel-eslint-plugin/test/rules/no-unused-expressions.js b/eslint/babel-eslint-plugin/test/rules/no-unused-expressions.js index 991bf6fa80b4..9ba9b5773952 100644 --- a/eslint/babel-eslint-plugin/test/rules/no-unused-expressions.js +++ b/eslint/babel-eslint-plugin/test/rules/no-unused-expressions.js @@ -1,5 +1,5 @@ import rule from "../../src/rules/no-unused-expressions"; -import RuleTester from "../helpers/RuleTester"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; const ruleTester = new RuleTester(); ruleTester.run("@babel/no-unused-expressions", rule, { 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 8a08a09516c7..0ce725bf748e 100644 --- a/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js +++ b/eslint/babel-eslint-plugin/test/rules/object-curly-spacing.js @@ -1,5 +1,5 @@ import rule from "../../src/rules/object-curly-spacing"; -import RuleTester from "../helpers/RuleTester"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; const ruleTester = new RuleTester(); ruleTester.run("@babel/object-curly-spacing", rule, { diff --git a/eslint/babel-eslint-plugin/test/rules/semi.js b/eslint/babel-eslint-plugin/test/rules/semi.js index d7a757b62616..815aeb00747c 100644 --- a/eslint/babel-eslint-plugin/test/rules/semi.js +++ b/eslint/babel-eslint-plugin/test/rules/semi.js @@ -1,5 +1,5 @@ import rule from "../../src/rules/semi"; -import RuleTester from "../helpers/RuleTester"; +import RuleTester from "@babel/eslint-shared-fixtures/utils/RuleTester"; const ruleTester = new RuleTester(); diff --git a/eslint/babel-eslint-plugin/test/helpers/RuleTester.js b/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js similarity index 53% rename from eslint/babel-eslint-plugin/test/helpers/RuleTester.js rename to eslint/babel-eslint-shared-fixtures/utils/RuleTester.js index 47166bd51185..1f1883fd41eb 100644 --- a/eslint/babel-eslint-plugin/test/helpers/RuleTester.js +++ b/eslint/babel-eslint-shared-fixtures/utils/RuleTester.js @@ -1,14 +1,15 @@ -import { RuleTester } from "eslint"; +const path = require("path"); +const { RuleTester } = require("eslint"); RuleTester.setDefaultConfig({ parser: require.resolve("@babel/eslint-parser"), parserOptions: { babelOptions: { configFile: require.resolve( - "@babel/eslint-shared-fixtures/config/babel.config.js", + path.join(__dirname, "../config/babel.config.js") ), }, }, }); -export default RuleTester; +module.exports = RuleTester; From fdf8a52bebeddc559d0827599376a2c6ee38321f Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 3 Apr 2020 22:01:59 -0400 Subject: [PATCH 02/14] 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..09eb3e4610d6 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 1332ae4a9e63..4af39f5d11f4 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") From b7135a221de6e2f6605793cfd1b03fd17d8d9e99 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Mon, 6 Apr 2020 15:26:22 -0400 Subject: [PATCH 03/14] Address feedback --- .../.npmignore | 0 .../README.md | 0 .../package.json | 6 +++--- .../src/index.js | 0 .../src/rules/dry-error-messages.js | 8 +++----- .../test/rules/dry-error-messages.js | 4 ++++ 6 files changed, 10 insertions(+), 8 deletions(-) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/.npmignore (100%) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/README.md (100%) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/package.json (83%) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/src/index.js (100%) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/src/rules/dry-error-messages.js (93%) rename eslint/{babel-eslint-plugin-internal => babel-eslint-plugin-development-internal}/test/rules/dry-error-messages.js (99%) diff --git a/eslint/babel-eslint-plugin-internal/.npmignore b/eslint/babel-eslint-plugin-development-internal/.npmignore similarity index 100% rename from eslint/babel-eslint-plugin-internal/.npmignore rename to eslint/babel-eslint-plugin-development-internal/.npmignore diff --git a/eslint/babel-eslint-plugin-internal/README.md b/eslint/babel-eslint-plugin-development-internal/README.md similarity index 100% rename from eslint/babel-eslint-plugin-internal/README.md rename to eslint/babel-eslint-plugin-development-internal/README.md diff --git a/eslint/babel-eslint-plugin-internal/package.json b/eslint/babel-eslint-plugin-development-internal/package.json similarity index 83% rename from eslint/babel-eslint-plugin-internal/package.json rename to eslint/babel-eslint-plugin-development-internal/package.json index d88ec5f0366a..2ebff45fa9b8 100644 --- a/eslint/babel-eslint-plugin-internal/package.json +++ b/eslint/babel-eslint-plugin-development-internal/package.json @@ -1,12 +1,12 @@ { - "name": "@babel/eslint-plugin-internal", + "name": "@babel/eslint-plugin-development-internal", "version": "0.0.0", "description": "The Babel Team's ESLint custom rules plugin. Since it's internal, it might not respect semver.", "main": "lib/index.js", "repository": { "type": "git", "url": "git+https://github.com/babel/babel.git", - "directory": "eslint/babel-eslint-plugin-internal" + "directory": "eslint/babel-eslint-plugin-development-internal" }, "keywords": [ "babel", @@ -24,7 +24,7 @@ "bugs": { "url": "https://github.com/babel/babel/issues" }, - "homepage": "https://github.com/babel/babel/tree/master/eslint/babel-eslint-plugin-internal", + "homepage": "https://github.com/babel/babel/tree/master/eslint/babel-eslint-plugin-development-internal", "peerDependencies": { "@babel/eslint-parser": "0.0.0", "eslint": ">=6.0.0" diff --git a/eslint/babel-eslint-plugin-internal/src/index.js b/eslint/babel-eslint-plugin-development-internal/src/index.js similarity index 100% rename from eslint/babel-eslint-plugin-internal/src/index.js rename to eslint/babel-eslint-plugin-development-internal/src/index.js diff --git a/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js similarity index 93% rename from eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js rename to eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js index 09eb3e4610d6..8540f0e22c66 100644 --- a/eslint/babel-eslint-plugin-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js @@ -108,12 +108,10 @@ export default { } } }, - "ThrowStatement[argument.type='CallExpression'] [callee.type='MemberExpression']"( - node, - ) { + "ThrowStatement > CallExpression[callee.type='MemberExpression']"(node) { if ( - node.callee.object?.type !== "ThisExpression" || - node.callee.property?.name !== "raise" + node.callee.object.type !== "ThisExpression" || + node.callee.property.name !== "raise" ) { return; } diff --git a/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js similarity index 99% rename from eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js rename to eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js index 4c42e5b0b2ed..f1faefc63e59 100644 --- a/eslint/babel-eslint-plugin-internal/test/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js @@ -17,6 +17,10 @@ ruleTester.run("dry-error-messages", rule, { "this.raise(() => { throw new Error('Uh oh') });", "throw new Error('Uh oh')", "throw this.createError('Uh oh')", + "throw this.error", + "throw this.raise", + "throw obj.error", + "throw obj.raise", { filename: FILENAME, code: From fe1ed133bbb3d027e4f11b82e8d5eac271417d5e Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 12 May 2020 16:38:54 -0400 Subject: [PATCH 04/14] Enable new rule --- .eslintrc.js | 26 +++++- .../src/index.js | 2 +- .../src/rules/dry-error-messages.js | 43 +++++++--- .../test/rules/dry-error-messages.js | 80 ++++++++++++++++--- .../src/index.js | 2 +- yarn.lock | 11 ++- 6 files changed, 133 insertions(+), 31 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6eea9bc6f6fc..1bd34c609349 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,7 +2,13 @@ const path = require("path"); module.exports = { root: true, - plugins: ["prettier", "@babel/development", "import", "jest"], + plugins: [ + "import", + "jest", + "prettier", + "@babel/development", + "@babel/development-internal", + ], // replace it by `@babel/internal` when `@babel/eslint-config-internal` is published extends: path.resolve(__dirname, "eslint/babel-eslint-config-internal"), rules: { @@ -44,8 +50,8 @@ module.exports = { "jest/no-identical-title": "off", "jest/no-standalone-expect": "off", "jest/no-test-callback": "off", - "jest/valid-describe": "off" - } + "jest/valid-describe": "off", + }, }, { files: ["packages/babel-plugin-*/src/index.js"], @@ -55,5 +61,19 @@ module.exports = { eqeqeq: ["error", "always", { null: "ignore" }], }, }, + { + files: ["packages/babel-parser/src/**/*.js"], + rules: { + "@babel/development-internal/dry-error-messages": [ + "error", + { + errorModule: path.resolve( + __dirname, + "packages/babel-parser/src/parser/location.js" + ), + }, + ], + }, + }, ], }; diff --git a/eslint/babel-eslint-plugin-development-internal/src/index.js b/eslint/babel-eslint-plugin-development-internal/src/index.js index 9db11d20c651..8761f3903c07 100644 --- a/eslint/babel-eslint-plugin-development-internal/src/index.js +++ b/eslint/babel-eslint-plugin-development-internal/src/index.js @@ -1,6 +1,6 @@ import dryErrorMessages from "./rules/dry-error-messages"; -export default { +module.exports = { rules: { "dry-error-messages": dryErrorMessages, }, diff --git a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js index 8540f0e22c66..00d7d1f3b7f4 100644 --- a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js @@ -10,17 +10,26 @@ 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)), - ) - ); - } +function resolveErrorModule(errorModule, currentFilePath) { + return isRelativePath(errorModule) + ? path.resolve(path.dirname(currentFilePath), normalizeSrcExt(errorModule)) + : errorModule; +} + +function isCurrentFileErrorModule(errorModule, currentFilePath) { + return ( + path.normalize(currentFilePath) === + path.normalize( + path.resolve(resolveErrorModule(errorModule, currentFilePath)), + ) + ); +} - return targetModulePath === src; +function isSourceErrorModule(targetModulePath, currentFilePath, src) { + return ( + path.normalize(resolveErrorModule(targetModulePath, currentFilePath)) === + path.normalize(resolveErrorModule(src, currentFilePath)) + ); } function findIdNode(node) { @@ -88,6 +97,7 @@ export default { errorModule: { type: "string" }, }, additionalProperties: false, + required: ["errorModule"], }, ], messages: { @@ -95,14 +105,23 @@ export default { }, }, create({ options, report, getFilename, getScope }) { - const [{ errorModule } = {}] = options; + const [{ errorModule = "" } = {}] = options; const filename = getFilename(); const importedBindings = new Set(); + if ( + // Do not run check if errorModule config option is not given. + !errorModule.length || + // Do not check the target error module file. + isCurrentFileErrorModule(errorModule, filename) + ) { + return {}; + } + 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)) { + if (isSourceErrorModule(errorModule, filename, node.source.value)) { for (const spec of node.specifiers) { importedBindings.add(spec); } diff --git a/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js index f1faefc63e59..81ec5cc2a6f0 100644 --- a/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js @@ -11,16 +11,57 @@ const ruleTester = new RuleTester(); ruleTester.run("dry-error-messages", rule, { 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')", - "throw this.error", - "throw this.raise", - "throw obj.error", - "throw obj.raise", + // Ignores malformed `this.raise` invocations. + { + filename: FILENAME, + code: "this.raise(loc);", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "this.notRaise(loc, 'Uh oh');", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw new Error(this.raise('Uh oh'));", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "this.raise(() => { throw new Error('Uh oh') });", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw new Error('Uh oh')", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw this.createError('Uh oh')", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw this.error", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw this.raise", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw obj.error", + options: [{ errorModule: ERRORS_MODULE }], + }, + { + filename: FILENAME, + code: "throw obj.raise", + options: [{ errorModule: ERRORS_MODULE }], + }, { filename: FILENAME, code: @@ -201,6 +242,25 @@ ruleTester.run("dry-error-messages", rule, { "import NotErrors, { Errors } from '../errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], }, + + // Do not warn when file linted is error module. + { + filename: FILENAME, + code: "throw this.raise(loc, 'Oh no!');", + options: [{ errorModule: FILENAME }], + }, + { + filename: MODULE_SAME_DIR, + code: "throw this.raise(loc, 'Oh no!');", + options: [{ errorModule: MODULE_SAME_DIR }], + }, + + // Do not warn if second argument is missing + { + filename: FILENAME, + code: "throw this.raise(loc);", + options: [{ errorModule: ERRORS_MODULE }], + }, ], invalid: [ { diff --git a/eslint/babel-eslint-plugin-development/src/index.js b/eslint/babel-eslint-plugin-development/src/index.js index ae6662710684..946da90045e2 100644 --- a/eslint/babel-eslint-plugin-development/src/index.js +++ b/eslint/babel-eslint-plugin-development/src/index.js @@ -2,7 +2,7 @@ import noDeprecatedClone from "./rules/no-deprecated-clone"; import noUndefinedIdentifier from "./rules/no-undefined-identifier"; import pluginName from "./rules/plugin-name"; -export default { +module.exports = { rules: { "no-deprecated-clone": noDeprecatedClone, "no-undefined-identifier": noUndefinedIdentifier, diff --git a/yarn.lock b/yarn.lock index e657ab15d887..079ac13168fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,10 +56,13 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/eslint-plugin-development@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin-development/-/eslint-plugin-development-1.0.1.tgz#1f5206ae95795db09b65e7dbc2b158d66497a44c" - integrity sha512-ioEhN8HgKr4Yx8ef+XryNpKN4FimSFceb0qVVxvoUzpFn3xyq17MlY5AquEqtXObE7Nu7WKq7QL9INzjCrugyw== +"@babel/eslint-plugin-development-internal@link:./eslint/babel-eslint-plugin-development-internal": + version "0.0.0" + uid "" + +"@babel/eslint-plugin-development@link:./eslint/babel-eslint-plugin-development": + version "0.0.0" + uid "" "@babel/generator@^7.10.1", "@babel/generator@^7.10.2", "@babel/generator@^7.4.0": version "7.10.2" From dcbc68332fcc92486be3e6f1982d6252ad3eb4e9 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 12 May 2020 18:04:18 -0400 Subject: [PATCH 05/14] fix author field --- eslint/babel-eslint-plugin-development-internal/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint/babel-eslint-plugin-development-internal/package.json b/eslint/babel-eslint-plugin-development-internal/package.json index 2ebff45fa9b8..7fd5eb7c869e 100644 --- a/eslint/babel-eslint-plugin-development-internal/package.json +++ b/eslint/babel-eslint-plugin-development-internal/package.json @@ -15,7 +15,7 @@ "eslint-plugin", "babel-eslint" ], - "author": "Kai Cataldo ", "license": "MIT", "private": true, "engines": { From 7bc7ccd786e8ba2187a7d52ad350e480a9ca18bf Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 12 May 2020 18:14:29 -0400 Subject: [PATCH 06/14] Fix errors --- packages/babel-parser/src/parser/util.js | 2 ++ packages/babel-parser/src/plugins/flow.js | 7 +++++++ packages/babel-parser/src/plugins/jsx/index.js | 6 ++++++ packages/babel-parser/src/tokenizer/index.js | 2 ++ 4 files changed, 17 insertions(+) diff --git a/packages/babel-parser/src/parser/util.js b/packages/babel-parser/src/parser/util.js index cc91ab28133a..c20835794385 100644 --- a/packages/babel-parser/src/parser/util.js +++ b/packages/babel-parser/src/parser/util.js @@ -146,7 +146,9 @@ export default class UtilParser extends Tokenizer { if (typeof messageOrType !== "string") { messageOrType = `Unexpected token, expected "${messageOrType.label}"`; } + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise(pos != null ? pos : this.state.start, messageOrType); + /* eslint-enable @babel/development-internal/dry-error-messages */ } expectPlugin(name: string, pos?: ?number): true { diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index f2558916a006..dd0bfec0d0c2 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -473,12 +473,15 @@ export default (superClass: Class): Class => ) { const label = this.state.value; const suggestion = exportSuggestions[label]; + + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, FlowErrors.UnsupportedDeclareExportKind, label, suggestion, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } if ( @@ -1499,10 +1502,12 @@ export default (superClass: Class): Class => ); } + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, FlowErrors.UnexpectedSubtractionOperand, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } throw this.unexpected(); @@ -2715,11 +2720,13 @@ export default (superClass: Class): Class => if (jsx?.thrown) throw jsx.error; if (arrow.thrown) throw arrow.error; + /* eslint-disable @babel/development-internal/dry-error-messages */ /*:: invariant(typeParameters) */ throw this.raise( typeParameters.start, FlowErrors.UnexpectedTokenAfterTypeParameter, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } return super.parseMaybeAssign( diff --git a/packages/babel-parser/src/plugins/jsx/index.js b/packages/babel-parser/src/plugins/jsx/index.js index ba91d78aeab2..4900176ab5c0 100644 --- a/packages/babel-parser/src/plugins/jsx/index.js +++ b/packages/babel-parser/src/plugins/jsx/index.js @@ -96,7 +96,9 @@ export default (superClass: Class): Class => let chunkStart = this.state.pos; for (;;) { if (this.state.pos >= this.length) { + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise(this.state.start, JsxErrors.UnterminatedJsxContent); + /* eslint-enable @babel/development-internal/dry-error-messages */ } const ch = this.input.charCodeAt(this.state.pos); @@ -302,7 +304,9 @@ export default (superClass: Class): Class => return this.parseExprAtom(); default: + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise(this.state.start, JsxErrors.UnsupportedJsxValue); + /* eslint-enable @babel/development-internal/dry-error-messages */ } } @@ -491,10 +495,12 @@ export default (superClass: Class): Class => } node.children = children; if (this.isRelational("<")) { + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, JsxErrors.UnwrappedAdjacentJSXElements, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } return isFragment(openingElement) diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 55cda33a6ed5..9b3251691718 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -420,12 +420,14 @@ export default class Tokenizer extends ParserErrors { // misleading this.expectPlugin("recordAndTuple"); if (this.getPluginOption("recordAndTuple", "syntaxType") !== "hash") { + /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.pos, next === charCodes.leftCurlyBrace ? Errors.RecordExpressionHashIncorrectStartSyntaxType : Errors.TupleExpressionHashIncorrectStartSyntaxType, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } if (next === charCodes.leftCurlyBrace) { From 7face3c71212bb053e7bdfd9567c72446dfc54e1 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 12 May 2020 19:42:11 -0400 Subject: [PATCH 07/14] Add readme --- .../README.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/eslint/babel-eslint-plugin-development-internal/README.md b/eslint/babel-eslint-plugin-development-internal/README.md index e69de29bb2d1..82dc2b846d5e 100644 --- a/eslint/babel-eslint-plugin-development-internal/README.md +++ b/eslint/babel-eslint-plugin-development-internal/README.md @@ -0,0 +1,38 @@ +# @babel/eslint-plugin-development-internal + +The Babel team's custom ESLint rules for the babel/babel monorepo. + +## Installation + +```sh +$ npm install --save-dev @babel/eslint-plugin-development-internal +``` +or +```sh +$ yarn add --save-dev @babel/eslint-plugin-development-internal +``` + + +Then, load the plugin in your `.eslintrc.*` configuration file (note that you can omit the `eslint-plugin-` prefix): + +```json +{ + "plugins": ["@babel/development-internal"] +} +``` + +## Rules + +### `@babel/development-internal/dry-error-messages` + +Intended for use in `packages/babel-parser/src/**/*`. When enabled, this rule warns when `this.raise()` invocations raise errors that are not imported from a designated error module. + +Accepts an object configuration option: + +```ts +{ + errorModule: string +} +``` + +`errorModule` (required): The rule expects either an absolute path or a module name (for a module in `node_modules`). Please note that the rule will not check anything if` errorModule` is not given. From b28131ae563ac9a1cbb67482216a9631a1484592 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 12 May 2020 19:46:16 -0400 Subject: [PATCH 08/14] Add example configuration --- .../README.md | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/eslint/babel-eslint-plugin-development-internal/README.md b/eslint/babel-eslint-plugin-development-internal/README.md index 82dc2b846d5e..b412c36013d8 100644 --- a/eslint/babel-eslint-plugin-development-internal/README.md +++ b/eslint/babel-eslint-plugin-development-internal/README.md @@ -12,8 +12,9 @@ or $ yarn add --save-dev @babel/eslint-plugin-development-internal ``` +## Usage -Then, load the plugin in your `.eslintrc.*` configuration file (note that you can omit the `eslint-plugin-` prefix): +The plugin can be loaded in your `.eslintrc.*` configuration file as follows: (note that you can omit the `eslint-plugin-` prefix): ```json { @@ -36,3 +37,34 @@ Accepts an object configuration option: ``` `errorModule` (required): The rule expects either an absolute path or a module name (for a module in `node_modules`). Please note that the rule will not check anything if` errorModule` is not given. + +Example configuration: + +```js +{ + rules: { + "@babel/development-internal/dry-error-messages": [ + "error", + { + errorModule: "@babel/shared-error-messages" + } + ] + } +} +``` +and +```js +{ + rules: { + "@babel/development-internal/dry-error-messages": [ + "error", + { + errorModule: path.resolve( + __dirname, + "packages/shared-error-messages/lib/index.js" + ) + } + ] + } +} +``` From 065ce01a75c99b8cfee82e5bf0e56f117b4f7ac0 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Mon, 8 Jun 2020 16:55:05 -0400 Subject: [PATCH 09/14] Handle directories --- .../src/rules/dry-error-messages.js | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js index 00d7d1f3b7f4..587ea472f2ba 100644 --- a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js @@ -6,30 +6,27 @@ function isRelativePath(filePath) { return REL_PATH_REGEX.test(filePath); } -function normalizeSrcExt(source) { - return !path.extname(source) ? `${source}.js` : source; +function resolveAbsolutePath(currentFilePath, moduleToResolve) { + return isRelativePath(moduleToResolve) + ? path.resolve(path.dirname(currentFilePath), moduleToResolve) + : moduleToResolve; } -function resolveErrorModule(errorModule, currentFilePath) { - return isRelativePath(errorModule) - ? path.resolve(path.dirname(currentFilePath), normalizeSrcExt(errorModule)) - : errorModule; -} +function isSourceErrorModule(currentFilePath, targetModulePath, src) { + for (const srcPath of [src, `${src}.js`, `${src}/index`, `${src}/index.js`]) { + if ( + path.normalize(resolveAbsolutePath(currentFilePath, targetModulePath)) === + path.normalize(resolveAbsolutePath(currentFilePath, srcPath)) + ) { + return true; + } + } -function isCurrentFileErrorModule(errorModule, currentFilePath) { - return ( - path.normalize(currentFilePath) === - path.normalize( - path.resolve(resolveErrorModule(errorModule, currentFilePath)), - ) - ); + return false; } -function isSourceErrorModule(targetModulePath, currentFilePath, src) { - return ( - path.normalize(resolveErrorModule(targetModulePath, currentFilePath)) === - path.normalize(resolveErrorModule(src, currentFilePath)) - ); +function isCurrentFileErrorModule(currentFilePath, errorModule) { + return currentFilePath === errorModule; } function findIdNode(node) { @@ -45,16 +42,16 @@ function findIdNode(node) { } function findReference(scope, node) { - let currScope = scope; + let currentScope = scope; - while (currScope) { - const ref = currScope.set.get(node.name); + while (currentScope) { + const ref = currentScope.set.get(node.name); if (ref) { return ref; } - currScope = currScope.upper; + currentScope = currentScope.upper; } return null; @@ -113,7 +110,7 @@ export default { // Do not run check if errorModule config option is not given. !errorModule.length || // Do not check the target error module file. - isCurrentFileErrorModule(errorModule, filename) + isCurrentFileErrorModule(filename, errorModule) ) { return {}; } @@ -121,7 +118,7 @@ export default { return { // Check imports up front so that we don't have to check them for every ThrowStatement. ImportDeclaration(node) { - if (isSourceErrorModule(errorModule, filename, node.source.value)) { + if (isSourceErrorModule(filename, errorModule, node.source.value)) { for (const spec of node.specifiers) { importedBindings.add(spec); } From 9cd320c5fb9be3ce7b1a3d44b0395b7fbcb0649e Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Mon, 8 Jun 2020 17:25:06 -0400 Subject: [PATCH 10/14] run make bootstrap --- yarn.lock | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 079ac13168fb..e657ab15d887 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,13 +56,10 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/eslint-plugin-development-internal@link:./eslint/babel-eslint-plugin-development-internal": - version "0.0.0" - uid "" - -"@babel/eslint-plugin-development@link:./eslint/babel-eslint-plugin-development": - version "0.0.0" - uid "" +"@babel/eslint-plugin-development@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin-development/-/eslint-plugin-development-1.0.1.tgz#1f5206ae95795db09b65e7dbc2b158d66497a44c" + integrity sha512-ioEhN8HgKr4Yx8ef+XryNpKN4FimSFceb0qVVxvoUzpFn3xyq17MlY5AquEqtXObE7Nu7WKq7QL9INzjCrugyw== "@babel/generator@^7.10.1", "@babel/generator@^7.10.2", "@babel/generator@^7.4.0": version "7.10.2" From 52be2ab3d71bd8c684535e42fca2638c8ed1adeb Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 9 Jun 2020 13:11:19 -0400 Subject: [PATCH 11/14] More updates! --- .eslintrc.js | 7 +- eslint/babel-eslint-config-internal/index.js | 2 +- .../babel-eslint-config-internal/package.json | 2 +- .../src/rules/dry-error-messages.js | 16 +- .../test/rules/dry-error-messages.js | 159 ++++++++++-------- package.json | 5 +- yarn.lock | 19 ++- 7 files changed, 118 insertions(+), 92 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 1bd34c609349..4013bc661d5b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,5 @@ +"use strict"; + const path = require("path"); module.exports = { @@ -9,8 +11,7 @@ module.exports = { "@babel/development", "@babel/development-internal", ], - // replace it by `@babel/internal` when `@babel/eslint-config-internal` is published - extends: path.resolve(__dirname, "eslint/babel-eslint-config-internal"), + extends: "@babel/internal", rules: { "prettier/prettier": "error", // TODO: remove after babel-eslint-config-internal is fully integrated into this repository. @@ -69,7 +70,7 @@ module.exports = { { errorModule: path.resolve( __dirname, - "packages/babel-parser/src/parser/location.js" + "packages/babel-parser/src/parser/error.js" ), }, ], diff --git a/eslint/babel-eslint-config-internal/index.js b/eslint/babel-eslint-config-internal/index.js index 6bf24402795c..a20fc920a11c 100644 --- a/eslint/babel-eslint-config-internal/index.js +++ b/eslint/babel-eslint-config-internal/index.js @@ -1,7 +1,7 @@ "use strict"; module.exports = { - parser: "babel-eslint", + parser: "@babel/eslint-parser", extends: "eslint:recommended", plugins: ["flowtype"], parserOptions: { diff --git a/eslint/babel-eslint-config-internal/package.json b/eslint/babel-eslint-config-internal/package.json index 292bf0a9081a..f3fac8b8d6fa 100644 --- a/eslint/babel-eslint-config-internal/package.json +++ b/eslint/babel-eslint-config-internal/package.json @@ -13,7 +13,7 @@ }, "main": "index.js", "peerDependencies": { - "babel-eslint": "^10.0.0 || ^11.0.0-0", + "@babel/eslint-parser": "*", "eslint-plugin-flowtype": "^3.0.0" } } diff --git a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js index 587ea472f2ba..23af6cef2be9 100644 --- a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js @@ -124,19 +124,9 @@ export default { } } }, - "ThrowStatement > 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; - } - + "CallExpression[callee.type='MemberExpression'][callee.object.type='ThisExpression'][callee.property.name='raise'][arguments.length>=2]"( + node, + ) { const [, errorMsgNode] = node.arguments; const nodeToCheck = findIdNode(errorMsgNode); diff --git a/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js index 81ec5cc2a6f0..5a3c5bf5336f 100644 --- a/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/test/rules/dry-error-messages.js @@ -49,7 +49,7 @@ ruleTester.run("dry-error-messages", rule, { }, { filename: FILENAME, - code: "throw this.raise", + code: "this.raise", options: [{ errorModule: ERRORS_MODULE }], }, { @@ -65,207 +65,207 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from 'errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import { Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from './errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], }, { filename: FILENAME, code: - "import { Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from '../errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], }, { filename: FILENAME, code: - "import { NotErrors, Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from 'errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import { NotErrors, Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from './errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], }, { filename: FILENAME, code: - "import { NotErrors, Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from '../errorsModule'; 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); }", + "import { Errors } from 'errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import { Errors } from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { Errors } from './errorsModule'; function fn() { 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); }", + "import { Errors } from '../errorsModule'; function fn() { 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); }", + "import { NotErrors, Errors } from 'errorsModule'; function fn() { 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); }", + "import { NotErrors, Errors } from './errorsModule'; function fn() { 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); }", + "import { NotErrors, Errors } from '../errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], }, { filename: FILENAME, code: - "import Errors from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from 'errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import Errors from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from './errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], }, { filename: FILENAME, code: - "import Errors from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from '../errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], }, { filename: FILENAME, code: - "import Errors, { NotErrors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from 'errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import Errors, { NotErrors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from './errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], }, { filename: FILENAME, code: - "import Errors, { NotErrors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from '../errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], }, { filename: FILENAME, code: - "import NotErrors, { Errors } from 'errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from 'errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import NotErrors, { Errors } from './errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from './errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], }, { filename: FILENAME, code: - "import NotErrors, { Errors } from '../errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from '../errorsModule'; 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); }", + "import Errors from 'errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], }, { filename: FILENAME, code: - "import Errors from './errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors from './errorsModule'; function fn() { 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); }", + "import Errors from '../errorsModule'; function fn() { 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); }", + "import Errors, { NotErrors } from 'errorsModule'; function fn() { 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); }", + "import Errors, { NotErrors } from './errorsModule'; function fn() { 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); }", + "import Errors, { NotErrors } from '../errorsModule'; function fn() { 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); }", + "import NotErrors, { Errors } from 'errorsModule'; function fn() { 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); }", + "import NotErrors, { Errors } from './errorsModule'; function fn() { 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); }", + "import NotErrors, { Errors } from '../errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], }, // Do not warn when file linted is error module. { filename: FILENAME, - code: "throw this.raise(loc, 'Oh no!');", + code: "this.raise(loc, 'Oh no!');", options: [{ errorModule: FILENAME }], }, { filename: MODULE_SAME_DIR, - code: "throw this.raise(loc, 'Oh no!');", + code: "this.raise(loc, 'Oh no!');", options: [{ errorModule: MODULE_SAME_DIR }], }, // Do not warn if second argument is missing { filename: FILENAME, - code: "throw this.raise(loc);", + code: "this.raise(loc);", options: [{ errorModule: ERRORS_MODULE }], }, ], invalid: [ { filename: FILENAME, - code: "throw this.raise(loc, Errors.someErrorMessage);", + code: "this.raise(loc, new Error('Uh oh'));", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -276,8 +276,18 @@ ruleTester.run("dry-error-messages", rule, { }, { filename: FILENAME, - code: - "const Errors = { someErrorMessage: 'Uh oh!' }; throw this.raise(loc, Errors.someErrorMessage);", + code: "throw this.raise(loc, new Error('Uh oh'));", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: "this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -289,7 +299,18 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from 'errorsModule'; throw this.raise(loc, 'Uh oh!');", + "const Errors = { someErrorMessage: 'Uh oh!' }; this.raise(loc, Errors.someErrorMessage);", + options: [{ errorModule: ERRORS_MODULE }], + errors: [ + { + messageId: "mustBeImported", + data: { errorModule: ERRORS_MODULE }, + }, + ], + }, + { + filename: FILENAME, + code: "import { Errors } from 'errorsModule'; this.raise(loc, 'Uh oh!');", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -301,7 +322,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from 'errorsModule'; const msg = 'Uh oh!'; throw this.raise(loc, msg);", + "import { Errors } from 'errorsModule'; const msg = 'Uh oh!'; this.raise(loc, msg);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -313,7 +334,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from 'not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -325,7 +346,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from './not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -337,7 +358,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { Errors } from '../not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -349,7 +370,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from 'not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -361,7 +382,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from './not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -373,7 +394,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import { NotErrors, Errors } from '../not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -385,7 +406,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { Errors } from 'not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -397,7 +418,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { Errors } from './not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -409,7 +430,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { Errors } from '../not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -421,7 +442,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { NotErrors, Errors } from 'not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -433,7 +454,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { NotErrors, Errors } from './not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -445,7 +466,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import { NotErrors, Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import { NotErrors, Errors } from '../not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -457,7 +478,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from 'not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -469,7 +490,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from './not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -481,7 +502,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors from '../not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -493,7 +514,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from 'not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -505,7 +526,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from './not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -517,7 +538,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import Errors, { NotErrors } from '../not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -529,7 +550,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from 'not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from 'not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -541,7 +562,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from './not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from './not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -553,7 +574,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from '../not-errorsModule'; throw this.raise(loc, Errors.someErrorMessage);", + "import NotErrors, { Errors } from '../not-errorsModule'; this.raise(loc, Errors.someErrorMessage);", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -565,7 +586,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors from 'not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -577,7 +598,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors from './not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -589,7 +610,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors from '../not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -601,7 +622,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors, { NotErrors } from 'not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -613,7 +634,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors, { NotErrors } from './not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -625,7 +646,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import Errors, { NotErrors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import Errors, { NotErrors } from '../not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { @@ -637,7 +658,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from 'not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import NotErrors, { Errors } from 'not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: ERRORS_MODULE }], errors: [ { @@ -649,7 +670,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from './not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import NotErrors, { Errors } from './not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_SAME_DIR }], errors: [ { @@ -661,7 +682,7 @@ ruleTester.run("dry-error-messages", rule, { { filename: FILENAME, code: - "import NotErrors, { Errors } from '../not-errorsModule'; function fn() { throw this.raise(loc, Errors.someErrorMessage); }", + "import NotErrors, { Errors } from '../not-errorsModule'; function fn() { this.raise(loc, Errors.someErrorMessage); }", options: [{ errorModule: MODULE_PARENT_DIR }], errors: [ { diff --git a/package.json b/package.json index 1b63836e5f94..12da041f1d0d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,10 @@ "devDependencies": { "@babel/cli": "^7.10.1", "@babel/core": "^7.10.2", - "@babel/eslint-plugin-development": "^1.0.1", + "@babel/eslint-config-internal": "link:./eslint/babel-eslint-config-internal", + "@babel/eslint-parser": "link:./eslint/babel-eslint-parser", + "@babel/eslint-plugin-development": "link:./eslint/babel-eslint-plugin-development", + "@babel/eslint-plugin-development-internal": "link:./eslint/babel-eslint-plugin-development-internal", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-dynamic-import": "^7.10.1", "@babel/plugin-proposal-export-namespace-from": "^7.10.1", diff --git a/yarn.lock b/yarn.lock index e657ab15d887..7d3013447c76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,10 +56,21 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/eslint-plugin-development@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin-development/-/eslint-plugin-development-1.0.1.tgz#1f5206ae95795db09b65e7dbc2b158d66497a44c" - integrity sha512-ioEhN8HgKr4Yx8ef+XryNpKN4FimSFceb0qVVxvoUzpFn3xyq17MlY5AquEqtXObE7Nu7WKq7QL9INzjCrugyw== +"@babel/eslint-config-internal@link:./eslint/babel-eslint-config-internal": + version "0.0.0" + uid "" + +"@babel/eslint-parser@link:./eslint/babel-eslint-parser": + version "0.0.0" + uid "" + +"@babel/eslint-plugin-development-internal@link:./eslint/babel-eslint-plugin-development-internal": + version "0.0.0" + uid "" + +"@babel/eslint-plugin-development@link:./eslint/babel-eslint-plugin-development": + version "0.0.0" + uid "" "@babel/generator@^7.10.1", "@babel/generator@^7.10.2", "@babel/generator@^7.4.0": version "7.10.2" From 7ad11cb78aa864b4a4656a0afcb33fe91d825ac9 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 12 Jun 2020 21:25:08 -0400 Subject: [PATCH 12/14] Fix errors --- .../src/rules/dry-error-messages.js | 4 ++-- packages/babel-parser/src/parser/error-message.js | 1 + packages/babel-parser/src/parser/expression.js | 2 ++ packages/babel-parser/src/parser/lval.js | 6 ++++++ packages/babel-parser/src/parser/statement.js | 2 ++ packages/babel-parser/src/parser/util.js | 12 ++++-------- packages/babel-parser/src/plugins/flow.js | 9 +++------ packages/babel-parser/src/plugins/jsx/index.js | 9 +++------ .../babel-parser/src/plugins/typescript/index.js | 3 +++ packages/babel-parser/src/tokenizer/index.js | 4 ++-- 10 files changed, 28 insertions(+), 24 deletions(-) diff --git a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js index 23af6cef2be9..2994d933912a 100644 --- a/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js +++ b/eslint/babel-eslint-plugin-development-internal/src/rules/dry-error-messages.js @@ -41,7 +41,7 @@ function findIdNode(node) { return null; } -function findReference(scope, node) { +function findReference(node, scope) { let currentScope = scope; while (currentScope) { @@ -58,7 +58,7 @@ function findReference(scope, node) { } function referencesImportedBinding(node, scope, bindings) { - const ref = findReference(scope, node); + const ref = findReference(node, scope); if (ref) { const topLevelDef = ref.defs[0]; diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index a738624bf254..5a7df725361c 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -59,6 +59,7 @@ export const ErrorMessages = Object.freeze({ ImportCallSpreadArgument: "... is not allowed in import()", ImportMetaOutsideModule: `import.meta may appear only with 'sourceType: "module"'`, ImportOutsideModule: `'import' and 'export' may appear only with 'sourceType: "module"'`, + InvalidBigIntLiteral: "Invalid BigIntLiteral", InvalidCodePoint: "Code point out of bounds", InvalidDigit: "Expected number in radix %0", InvalidEscapeSequence: "Bad character escape sequence", diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 8c4dc7bd191b..cc6278c2f532 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1467,7 +1467,9 @@ export default class ExpressionParser extends LValParser { error += " or class properties"; } + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise(metaProp.start, error); + /* eslint-enable @babel/development-internal/dry-error-messages */ } return metaProp; diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 647d48a5389d..a952219dd482 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -143,7 +143,9 @@ export default class LValParser extends NodeUtils { ? Errors.PatternHasAccessor : Errors.PatternHasMethod; + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise(prop.key.start, error); + /* eslint-enable @babel/development-internal/dry-error-messages */ } else if (prop.type === "SpreadElement" && !isLast) { this.raiseRestNotLast(prop.start); } else { @@ -356,6 +358,7 @@ export default class LValParser extends NodeUtils { ? isStrictBindReservedWord(expr.name, this.inModule) : isStrictBindOnlyReservedWord(expr.name)) ) { + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise( expr.start, bindingType === BIND_NONE @@ -363,6 +366,7 @@ export default class LValParser extends NodeUtils { : Errors.StrictEvalArgumentsBinding, expr.name, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } if (checkClashes) { @@ -459,6 +463,7 @@ export default class LValParser extends NodeUtils { break; default: { + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise( expr.start, bindingType === BIND_NONE @@ -466,6 +471,7 @@ export default class LValParser extends NodeUtils { : Errors.InvalidLhsBinding, contextDescription, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } } } diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index e201cfcd36cc..9bbed6ca25f1 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -2019,6 +2019,7 @@ export default class StatementParser extends ExpressionParser { name: string, ): void { if (this.state.exportedIdentifiers.indexOf(name) > -1) { + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise( node.start, name === "default" @@ -2026,6 +2027,7 @@ export default class StatementParser extends ExpressionParser { : Errors.DuplicateExport, name, ); + /* eslint-enable @babel/development-internal/dry-error-messages */ } this.state.exportedIdentifiers.push(name); } diff --git a/packages/babel-parser/src/parser/util.js b/packages/babel-parser/src/parser/util.js index c20835794385..8928698e6b70 100644 --- a/packages/babel-parser/src/parser/util.js +++ b/packages/babel-parser/src/parser/util.js @@ -132,7 +132,9 @@ export default class UtilParser extends Tokenizer { // Throws if the current token and the prev one are separated by a space. assertNoSpace(message: string = "Unexpected space."): void { if (this.state.start > this.state.lastTokEnd) { + /* eslint-disable @babel/development-internal/dry-error-messages */ this.raise(this.state.lastTokEnd, message); + /* eslint-enable @babel/development-internal/dry-error-messages */ } } @@ -180,16 +182,10 @@ export default class UtilParser extends Tokenizer { this.state.yieldPos !== -1 && (this.state.awaitPos === -1 || this.state.yieldPos < this.state.awaitPos) ) { - this.raise( - this.state.yieldPos, - "Yield cannot be used as name inside a generator function", - ); + this.raise(this.state.yieldPos, Errors.YieldBindingIdentifier); } if (this.state.awaitPos !== -1) { - this.raise( - this.state.awaitPos, - "Await cannot be used as name inside an async function", - ); + this.raise(this.state.awaitPos, Errors.AwaitBindingIdentifier); } } diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index dd0bfec0d0c2..508845d1046c 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -2,6 +2,9 @@ /*:: declare var invariant; */ +// Error messages are colocated with the plugin. +/* eslint-disable @babel/development-internal/dry-error-messages */ + import type Parser from "../parser"; import { types as tt, type TokenType } from "../tokenizer/types"; import * as N from "../types"; @@ -474,14 +477,12 @@ export default (superClass: Class): Class => const label = this.state.value; const suggestion = exportSuggestions[label]; - /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, FlowErrors.UnsupportedDeclareExportKind, label, suggestion, ); - /* eslint-enable @babel/development-internal/dry-error-messages */ } if ( @@ -1502,12 +1503,10 @@ export default (superClass: Class): Class => ); } - /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, FlowErrors.UnexpectedSubtractionOperand, ); - /* eslint-enable @babel/development-internal/dry-error-messages */ } throw this.unexpected(); @@ -2720,13 +2719,11 @@ export default (superClass: Class): Class => if (jsx?.thrown) throw jsx.error; if (arrow.thrown) throw arrow.error; - /* eslint-disable @babel/development-internal/dry-error-messages */ /*:: invariant(typeParameters) */ throw this.raise( typeParameters.start, FlowErrors.UnexpectedTokenAfterTypeParameter, ); - /* eslint-enable @babel/development-internal/dry-error-messages */ } return super.parseMaybeAssign( diff --git a/packages/babel-parser/src/plugins/jsx/index.js b/packages/babel-parser/src/plugins/jsx/index.js index 4900176ab5c0..c8a44b1f78e3 100644 --- a/packages/babel-parser/src/plugins/jsx/index.js +++ b/packages/babel-parser/src/plugins/jsx/index.js @@ -1,5 +1,8 @@ // @flow +// Error messages are colocated with the plugin. +/* eslint-disable @babel/development-internal/dry-error-messages */ + import * as charCodes from "charcodes"; import XHTMLEntities from "./xhtml"; @@ -96,9 +99,7 @@ export default (superClass: Class): Class => let chunkStart = this.state.pos; for (;;) { if (this.state.pos >= this.length) { - /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise(this.state.start, JsxErrors.UnterminatedJsxContent); - /* eslint-enable @babel/development-internal/dry-error-messages */ } const ch = this.input.charCodeAt(this.state.pos); @@ -304,9 +305,7 @@ export default (superClass: Class): Class => return this.parseExprAtom(); default: - /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise(this.state.start, JsxErrors.UnsupportedJsxValue); - /* eslint-enable @babel/development-internal/dry-error-messages */ } } @@ -495,12 +494,10 @@ export default (superClass: Class): Class => } node.children = children; if (this.isRelational("<")) { - /* eslint-disable @babel/development-internal/dry-error-messages */ throw this.raise( this.state.start, JsxErrors.UnwrappedAdjacentJSXElements, ); - /* eslint-enable @babel/development-internal/dry-error-messages */ } return isFragment(openingElement) diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index 2477a62e408d..6309c8ea8fcb 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -2,6 +2,9 @@ /*:: declare var invariant; */ +// Error messages are colocated with the plugin. +/* eslint-disable @babel/development-internal/dry-error-messages */ + import type { TokenType } from "../../tokenizer/types"; import type State from "../../tokenizer/state"; import { types as tt } from "../../tokenizer/types"; diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 9b3251691718..1a8af6cbbdd8 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -1150,7 +1150,7 @@ export default class Tokenizer extends ParserErrors { if (next === charCodes.plusSign || next === charCodes.dash) { ++this.state.pos; } - if (this.readInt(10) === null) this.raise(start, "Invalid number"); + if (this.readInt(10) === null) this.raise(start, Errors.InvalidNumber); isFloat = true; next = this.input.charCodeAt(this.state.pos); } @@ -1173,7 +1173,7 @@ export default class Tokenizer extends ParserErrors { // disallow floats, legacy octal syntax and non octal decimals // new style octal ("0o") is handled in this.readRadixNumber if (isFloat || octal || isNonOctalDecimalInt) { - this.raise(start, "Invalid BigIntLiteral"); + this.raise(start, Errors.InvalidBigIntLiteral); } ++this.state.pos; isBigInt = true; From 535d8de0488053a7c20fdd37c156af9f7b99fb5a Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 12 Jun 2020 21:41:42 -0400 Subject: [PATCH 13/14] Update tests --- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../yield/parameter-name-arrow-inside-generator-1/output.json | 2 +- .../yield/parameter-name-arrow-inside-generator-2/output.json | 2 +- .../yield/parameter-name-arrow-inside-generator-3/output.json | 2 +- .../async-await-as-arrow-binding-identifier/output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../invalid-yield-generator-arrow-default/output.json | 2 +- .../invalid-yield-generator-arrow-parameter/output.json | 2 +- .../invalid-yield-generator-arrow-parameters/output.json | 2 +- .../es2015-yield/yield-generator-arrow-default/output.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-1/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-1/output.json index 7fb0d2ac2cda..e2da3742e2f0 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-1/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-1/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":39,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:7)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:7)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-2/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-2/output.json index f526c3252076..06385571b6c1 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-2/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-2/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":53,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:15)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:15)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-3/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-3/output.json index f6e29bf0fdb1..010f31c93aa5 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-3/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-3/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":42,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:7)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:7)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-4/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-4/output.json index 427ec4363f69..13407641824c 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-4/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-4/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":49,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:17)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:17)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-5/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-5/output.json index 4f2ee50da949..dfc02f63790c 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-5/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-5/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":47,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:8)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:8)", "SyntaxError: Binding invalid left-hand side in function parameter list (2:8)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-6/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-6/output.json index b78292c7993d..ae3b4ae99d77 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-6/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-default-inside-arrow-inside-generator-6/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":41,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:8)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:8)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-1/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-1/output.json index ff99d56fa462..a36032ac4b88 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-1/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-1/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:3)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:3)", "SyntaxError: Binding invalid left-hand side in function parameter list (2:3)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-2/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-2/output.json index fae1c616f040..57995f28ee4f 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-2/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-2/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":38,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:3)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:3)", "SyntaxError: Binding invalid left-hand side in function parameter list (2:3)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-3/output.json b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-3/output.json index 6e589aab512a..44660a84d0c9 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-3/output.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/parameter-name-arrow-inside-generator-3/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":41,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (2:9)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (2:9)", "SyntaxError: Binding invalid left-hand side in function parameter list (2:9)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/async-await-as-arrow-binding-identifier/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/async-await-as-arrow-binding-identifier/output.json index f41c5e0fe4e6..09b554179dcb 100644 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/async-await-as-arrow-binding-identifier/output.json +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/async-await-as-arrow-binding-identifier/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":17,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":17}}, "errors": [ - "SyntaxError: Await cannot be used as name inside an async function (1:6)" + "SyntaxError: Can not use 'await' as identifier inside an async function (1:6)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/await-binding-inside-arrow-params-inside-async-arrow-params/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/await-binding-inside-arrow-params-inside-async-arrow-params/output.json index c6a76429a103..1cd8424fcc9b 100644 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/await-binding-inside-arrow-params-inside-async-arrow-params/output.json +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/await-binding-inside-arrow-params-inside-async-arrow-params/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}}, "errors": [ - "SyntaxError: Await cannot be used as name inside an async function (1:20)" + "SyntaxError: Can not use 'await' as identifier inside an async function (1:20)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-arguments-of-async-call-inside-parameters-of-async-arrow-function/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-arguments-of-async-call-inside-parameters-of-async-arrow-function/output.json index fe9f611da097..40be26a790f4 100644 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-arguments-of-async-call-inside-parameters-of-async-arrow-function/output.json +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-arguments-of-async-call-inside-parameters-of-async-arrow-function/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":63,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Await cannot be used as name inside an async function (2:23)" + "SyntaxError: Can not use 'await' as identifier inside an async function (2:23)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-arrow-function/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-arrow-function/output.json index 46e14510807e..b0a4f4215a5f 100644 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-arrow-function/output.json +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-arrow-function/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":46,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Await cannot be used as name inside an async function (2:7)" + "SyntaxError: Can not use 'await' as identifier inside an async function (2:7)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-async-arrow-function/output.json b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-async-arrow-function/output.json index da4bfb18b9e8..64f74b32e873 100644 --- a/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-async-arrow-function/output.json +++ b/packages/babel-parser/test/fixtures/es2017/async-functions/await-inside-parameters-of-nested-async-arrow-function/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":52,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "errors": [ - "SyntaxError: Await cannot be used as name inside an async function (2:13)" + "SyntaxError: Can not use 'await' as identifier inside an async function (2:13)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-default/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-default/output.json index 4081ebee04bb..def9e45bf335 100644 --- a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-default/output.json +++ b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-default/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":38,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":38}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (1:21)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (1:21)" ], "program": { "type": "Program", diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameter/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameter/output.json index 2ef911f25615..64ad613826ec 100644 --- a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameter/output.json +++ b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameter/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":30,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (1:16)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (1:16)", "SyntaxError: Binding invalid left-hand side in function parameter list (1:16)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameters/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameters/output.json index 5656f98e9947..64047fad86b2 100644 --- a/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameters/output.json +++ b/packages/babel-parser/test/fixtures/esprima/es2015-yield/invalid-yield-generator-arrow-parameters/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":39,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":39}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (1:25)", + "SyntaxError: Can not use 'yield' as identifier inside a generator (1:25)", "SyntaxError: Binding invalid left-hand side in function parameter list (1:25)" ], "program": { diff --git a/packages/babel-parser/test/fixtures/esprima/es2015-yield/yield-generator-arrow-default/output.json b/packages/babel-parser/test/fixtures/esprima/es2015-yield/yield-generator-arrow-default/output.json index a560dd2c5e32..90f20d4f5718 100644 --- a/packages/babel-parser/test/fixtures/esprima/es2015-yield/yield-generator-arrow-default/output.json +++ b/packages/babel-parser/test/fixtures/esprima/es2015-yield/yield-generator-arrow-default/output.json @@ -2,7 +2,7 @@ "type": "File", "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}}, "errors": [ - "SyntaxError: Yield cannot be used as name inside a generator function (1:21)" + "SyntaxError: Can not use 'yield' as identifier inside a generator (1:21)" ], "program": { "type": "Program", From 1f885a30d71c6da5e5b6a11f6204f767a0d8e029 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Fri, 12 Jun 2020 22:24:16 -0400 Subject: [PATCH 14/14] Fix CI race condition --- Makefile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index d635783bae32..dd41a0cb0918 100644 --- a/Makefile +++ b/Makefile @@ -84,9 +84,11 @@ build-no-bundle-ci: bootstrap-only watch: build-no-bundle BABEL_ENV=development $(YARN) gulp watch -code-quality-ci: flowcheck-ci lint-ci +code-quality-ci: build-no-bundle-ci + $(MAKE) flowcheck-ci & $(MAKE) lint-ci -flowcheck-ci: bootstrap-flowcheck + +flowcheck-ci: $(MAKE) flow code-quality: flow lint @@ -94,17 +96,15 @@ code-quality: flow lint flow: $(YARN) flow check --strip-root -bootstrap-flowcheck: build-no-bundle-ci - lint-ci: lint-js-ci lint-ts-ci check-compat-data-ci -lint-js-ci: bootstrap-only +lint-js-ci: $(MAKE) lint-js -lint-ts-ci: bootstrap-flowcheck +lint-ts-ci: $(MAKE) lint-ts -check-compat-data-ci: build-no-bundle-ci +check-compat-data-ci: $(MAKE) check-compat-data lint: lint-js lint-ts