From 7692378aa60a5a4d12eb410711aecbf1d7265294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 2 Nov 2021 09:26:18 +0100 Subject: [PATCH 1/2] Fix `parserOverride` support in `@babel/eslint-parser` --- .../src/worker/maybeParse.cjs | 7 ++- .../parser-override/babel.config.json | 3 ++ .../test/fixtures/parser-override/plugin.js | 9 ++++ .../test/integration/parser-override.js | 47 +++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 eslint/babel-eslint-tests/test/fixtures/parser-override/babel.config.json create mode 100644 eslint/babel-eslint-tests/test/fixtures/parser-override/plugin.js create mode 100644 eslint/babel-eslint-tests/test/integration/parser-override.js 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..c2ed899f554a --- /dev/null +++ b/eslint/babel-eslint-tests/test/integration/parser-override.js @@ -0,0 +1,47 @@ +import path from "path"; +import { fileURLToPath } from "url"; +import * as babelESLint from "@babel/eslint-parser"; +import * as babelESLintWorker from "@babel/eslint-parser/experimental-worker"; + +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); + }); + + it("works when parsing in a 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); + }); +}); From e1a0f9b8c45a77e1de2686a3424b67cfdfe9b2f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 2 Nov 2021 09:39:56 +0100 Subject: [PATCH 2/2] Fix test --- .../test/integration/parser-override.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/eslint/babel-eslint-tests/test/integration/parser-override.js b/eslint/babel-eslint-tests/test/integration/parser-override.js index c2ed899f554a..1091c40671a1 100644 --- a/eslint/babel-eslint-tests/test/integration/parser-override.js +++ b/eslint/babel-eslint-tests/test/integration/parser-override.js @@ -1,7 +1,7 @@ import path from "path"; import { fileURLToPath } from "url"; +import { createRequire } from "module"; import * as babelESLint from "@babel/eslint-parser"; -import * as babelESLintWorker from "@babel/eslint-parser/experimental-worker"; describe("parserOverride", () => { const expectedAST = { @@ -31,7 +31,11 @@ describe("parserOverride", () => { expect(ast).toMatchObject(expectedAST); }); - it("works when parsing in a worker", () => { + 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: {