diff --git a/eslint/babel-eslint-parser/src/worker/maybeParse.cjs b/eslint/babel-eslint-parser/src/worker/maybeParse.cjs index 22c6fcaa7147..3b79a45c4030 100644 --- a/eslint/babel-eslint-parser/src/worker/maybeParse.cjs +++ b/eslint/babel-eslint-parser/src/worker/maybeParse.cjs @@ -15,7 +15,8 @@ module.exports = function maybeParse(code, options) { { dirname: __dirname, type: "plugin" }, ); } - options.plugins.push(extractParserOptionsConfigItem); + const { plugins } = options; + options.plugins = plugins.concat(extractParserOptionsConfigItem); try { return { @@ -28,8 +29,10 @@ module.exports = function maybeParse(code, options) { } } - let ast; + // There was already a parserOverride, so remove our plugin. + options.plugins = plugins; + let ast; try { ast = babel.parseSync(code, options); } catch (err) { diff --git a/eslint/babel-eslint-tests/test/fixtures/parser-override/babel.config.json b/eslint/babel-eslint-tests/test/fixtures/parser-override/babel.config.json new file mode 100644 index 000000000000..1fbb7f264ff0 --- /dev/null +++ b/eslint/babel-eslint-tests/test/fixtures/parser-override/babel.config.json @@ -0,0 +1,3 @@ +{ + "plugins": ["./plugin.js"] +} diff --git a/eslint/babel-eslint-tests/test/fixtures/parser-override/plugin.js b/eslint/babel-eslint-tests/test/fixtures/parser-override/plugin.js new file mode 100644 index 000000000000..979051f29354 --- /dev/null +++ b/eslint/babel-eslint-tests/test/fixtures/parser-override/plugin.js @@ -0,0 +1,9 @@ +const parser = require("@babel/parser"); + +module.exports = function () { + return { + parserOverride(code, opts) { + return parser.parse(`foo;`, opts); + }, + }; +}; diff --git a/eslint/babel-eslint-tests/test/integration/parser-override.js b/eslint/babel-eslint-tests/test/integration/parser-override.js new file mode 100644 index 000000000000..1091c40671a1 --- /dev/null +++ b/eslint/babel-eslint-tests/test/integration/parser-override.js @@ -0,0 +1,51 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import { createRequire } from "module"; +import * as babelESLint from "@babel/eslint-parser"; + +describe("parserOverride", () => { + const expectedAST = { + type: "Program", + body: [ + { + type: "ExpressionStatement", + expression: { + type: "Identifier", + name: "foo", + }, + }, + ], + }; + + it("works when parsing in the main thread", () => { + const { ast } = babelESLint.parseForESLint(`27`, { + filename: "input.js", + babelOptions: { + configFile: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../fixtures/parser-override/babel.config.json", + ), + }, + }); + + expect(ast).toMatchObject(expectedAST); + }); + + const babel7node12 = parseInt(process.versions.node) < 12 ? it.skip : it; + babel7node12("works when parsing in a worker", async () => { + const require = createRequire(import.meta.url); + const babelESLintWorker = require("@babel/eslint-parser/experimental-worker"); + + const { ast } = babelESLintWorker.parseForESLint(`27`, { + filename: "input.js", + babelOptions: { + configFile: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../fixtures/parser-override/babel.config.json", + ), + }, + }); + + expect(ast).toMatchObject(expectedAST); + }); +});